Python子进程Popen传递参数

时间:2014-05-03 12:25:11

标签: python shell

我试图用我的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

1 个答案:

答案 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用这种方法注入随机代码要困难一些。所以我建议去做吧。