Running bash script from within python

前端 未结 7 852
死守一世寂寞
死守一世寂寞 2020-11-27 11:50

I have a problem with the following code:

callBash.py:

import subprocess
print \"start\"
subprocess.call(\"sleep.sh\")
print \"end\"         


        
相关标签:
7条回答
  • 2020-11-27 11:58

    If sleep.sh has the shebang #!/bin/sh and it has appropriate file permissions -- run chmod u+rx sleep.sh to make sure and it is in $PATH then your code should work as is:

    import subprocess
    
    rc = subprocess.call("sleep.sh")
    

    If the script is not in the PATH then specify the full path to it e.g., if it is in the current working directory:

    from subprocess import call
    
    rc = call("./sleep.sh")
    

    If the script has no shebang then you need to specify shell=True:

    rc = call("./sleep.sh", shell=True)
    

    If the script has no executable permissions and you can't change it e.g., by running os.chmod('sleep.sh', 0o755) then you could read the script as a text file and pass the string to subprocess module instead:

    with open('sleep.sh', 'rb') as file:
        script = file.read()
    rc = call(script, shell=True)
    
    0 讨论(0)
  • 2020-11-27 11:58

    If chmod not working then you also try

    import os
    os.system('sh script.sh')
    #you can also use bash instead of sh
    

    test by me thanks

    0 讨论(0)
  • 2020-11-27 12:01

    Make sure that sleep.sh has execution permissions, and run it with shell=True:

    #!/usr/bin/python
    
    import subprocess
    print "start"
    subprocess.call("./sleep.sh", shell=True)
    print "end"
    
    0 讨论(0)
  • 2020-11-27 12:02

    Making sleep.sh executable and adding shell=True to the parameter list (as suggested in previous answers) works ok. Depending on the search path, you may also need to add ./ or some other appropriate path. (Ie, change "sleep.sh" to "./sleep.sh".)

    The shell=True parameter is not needed (under a Posix system like Linux) if the first line of the bash script is a path to a shell; for example, #!/bin/bash.

    0 讨论(0)
  • 2020-11-27 12:10

    Adding an answer because I was directed here after asking how to run a bash script from python. You receive an error OSError: [Errno 2] file not found if your script takes in parameters. Lets say for instance your script took in a sleep time parameter: subprocess.call("sleep.sh 10") will not work, you must pass it as an array: subprocess.call(["sleep.sh", 10])

    0 讨论(0)
  • 2020-11-27 12:16

    Actually, you just have to add the shell=True argument:

    subprocess.call("sleep.sh", shell=True)
    

    But beware -

    Warning Invoking the system shell with shell=True can be a security hazard if combined with untrusted input. See the warning under Frequently Used Arguments for details.

    source

    0 讨论(0)
提交回复
热议问题