Reputation: 611
How do I go about running a bash script using the subprocess module, to which I must give several arguments?
This is what I'm currently using:
subprocess.Popen(['/my/file/path/programname.sh', 'arg1 arg2 %s' % arg3], \
shell = True)
The bash script seems not to be taking any of the parameters in. Any insights are greatly appreciated!
Upvotes: 45
Views: 129487
Reputation: 463
Since Python 3.5, most use cases are fine using subprocess.run()
instead of Popen()
(which of course can still be used).
See also this answer: https://stackoverflow.com/a/39187984/6266506
The fix for this question remains "use either a list of arguments or just one string", as stated in this section of the documentation.
Upvotes: 0
Reputation: 803
This is how it worked for me
import subprocess
subprocess.Popen(["path/to/file.sh", arg1, arg2, arg3])
Upvotes: 1
Reputation: 1185
One more example, which is not included in all the above ones,
subprocess.Popen(['/your/script.sh %s %s %s' %(argument1,argument2,argument3)], shell = True)
Please note that, when you type %(argument1,argument2,argument3)
, there should not be any space between %
and (
, eg % (argument1,argument2,argument3)
is not valid.
Upvotes: 3
Reputation: 68
Hi I know that this is solution is quite late, but could help someone.
example:
import subprocess
pass_arg=[]
pass_arg[0]="/home/test.sh"
pass_arg[1]="arg1"
pass_arg[2]="arg2"
subprocess.check_call(pass_arg)
The above example provides arg1 and arg2 as parameters to the shell script test.sh
Essentially, subprocess expects an array. So you could populate an array and provide it as a parameter.
Upvotes: 2
Reputation: 414139
Pass arguments as a list, see the very first code example in the docs:
import subprocess
subprocess.check_call(['/my/file/path/programname.sh', 'arg1', 'arg2', arg3])
If arg3
is not a string; convert it to string before passing to check_call()
: arg3 = str(arg3)
.
Upvotes: 53
Reputation:
subprocess.Popen(['/my/file/path/programname.sh arg1 arg2 %s' % arg3], shell = True).
If you use shell = True
the script and its arguments have to be passed as a string. Any other elements in the args
sequence will be treated as arguments to the shell.
You can find the complete docs at http://docs.python.org/2/library/subprocess.html#subprocess.Popen.
Upvotes: 17
Reputation: 5239
You forgot to add args
name.
subprocess.Popen(args=['./test.sh', 'arg1 arg2 %s' % arg3], shell=True)
Upvotes: 1