我试图用我的python调用带有参数的shell脚本但是没有传递参数
我的Shellscript:
echo "Inside shell"
echo $0
echo $1
cd $1
pwd
for file in *.csv
do
split -l 50000 -d -a 4 "$file" "$file"
done
echo "Outside shell"
shell = True
this_dir = os.path.dirname(os.path.abspath(__file__))
cmd = [os.path.join(this_dir,'split.sh'),fileslocation]
print 'cmd = ', cmd
process = subprocess.Popen(cmd,shell=True)
参数未正确传递......
使用Shell = True删除
cmd = ['/opt/sw/p3/src/PricesPaidAPI/split.sh', '../cookedData']
Traceback (most recent call last):
File "csv_rename.py", line 23, in <module>
process = subprocess.Popen(cmd)
File "/usr/lib/python2.7/subprocess.py", line 679, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1249, in _execute_child
raise child_exception
OSError: [Errno 8] Exec format error
答案 0 :(得分:0)
好吧,我不知道这是否应该是一个骗局,或者不是(根据评论)。但是shebang帮助了这个事实。这是确认。
popen_test.py:
import subprocess
subprocess.Popen(["./dummy.sh", "test"])
noshebang.sh:
echo "Echoing: $1"
这会导致OSError: [Errno 8] Exec format error
。这是因为OS期望文件可执行(duh)。但是,第一行中的#!
- shebang是系统的特殊标记,该文件应在其指定的shell环境中执行。所以它可以被视为可执行文件,即使它不是。所以:
shebang.sh:
#!/bin/sh
echo "Echoing: $1"
作品。
它与python的shell=True
基本相同。只是系统负责它。 IMO用这种方法注入随机代码要困难一些。所以我建议去做吧。