0

引数を指定して python subprocess.call を使用して、シェル スクリプトを呼び出そうとしています。私が持っている引数はシェルスクリプトに渡されていませんが、スクリプトは問題なく呼び出されています。これが私が持っているものです

prepend = str(prepend)
print "prepend = " + str(prepend)
filename = str(request.FILES['mdbfile'])
print "filename = " + str(filename)
PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))
print "PROJECT_ROOT = " + str(PROJECT_ROOT)
filename = str(PROJECT_ROOT) + '/%s' % filename
print "full_filename = " + str(filename)
cmd = '%s/buildcsvs.sh' % (PROJECT_ROOT)
print "full_cmd = " + str(cmd)
p = subprocess.call([cmd, filename, prepend], shell=True)
output = p.stdout.read()
print output

シェルスクリプトはこんな感じ

#${1} is the file name, ${2} is the prepend code
echo "mdb-export ${1} TEAM > \"${2}team.csv\""
mdb-export ${1} TEAM > "${2}team.csv"

そして、出力は次のようになります

prepend = 749176818
filename = 2011ROXBURY.mdb
PROJECT_ROOT = /Planner
full_filename = /Planner/2011ROXBURY.mdb
full_cmd = /Planner/buildcsvs.sh
Exception AttributeError: AttributeError("'_DummyThread' object has no attribute   '_Thread__block'",) in <module 'threading' from '/usr/lib/python2.7/threading.pyc'> ignored
mdb-export  TEAM > "team.csv"
Usage: mdb-export [options] <file> <table>

誰かが私が間違っていることを知っていますか? ありがとう -- ご協力ありがとうございます

編集: 今、私はこれを持っています:

print "full_cmd = " + str(cmd)
args = "%s %s" % (filename, prepend)
print "full_args = " + str(args)
(out, err) = Popen(cmd,  stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True).communicate(args)

スクリプトへの呼び出しが正常に完了しているようには見えません。

理由はわかりますか?

4

1 に答える 1

2

引数を渡す場合shell=True、リストではなく文字列でなければなりません:

In [4]: from subprocess import check_output

In [5]: check_output(['echo', '123'])
Out[5]: '123\n'

In [6]: check_output(['echo', '123'], shell=True)
Out[6]: '\n'

In [7]: check_output('echo 123', shell=True)
Out[7]: '123\n'

編集:を使用する代わりに、この目的のために作成された を使用する必要がcallあり、デッドロックを回避するのに役立ちます。p.stdout.readPopen().communicate

Edit² (上記の編集への回答):

cmd = ' '.join([cmd, args])
(out, err) = Popen(cmd,  stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True, shell=True).communicate(None)

完全なコマンドラインを に渡す必要がありPopenます。Argument toは( =返さcommunicateれるもの) に書き込まれます。process.stdinprocessPopen

于 2012-06-13T11:20:09.137 に答える