Python - 无法调用系统命令

3

我有一些Python代码,想要调用另一个程序。这个程序会:

  • STDOUT打印一些输出
  • 将文件写入磁盘

使用call函数会得到以下行为:

from subprocess import call
call(['./tango_x86_64_release', 'VTS1 ct="N" nt="N" ph="7.2" te="303" io="0.02" seq="MKHPYEEFPTGSKSPYNMSRGAHPGAV"'])
34, File not properly written, try writing it up again, 
1

无论参数是否拆分成列表,这种情况都会发生;
call(['./tango_x86_64_release', 'VTS1', 'ct="N"', 'nt="N"', 'ph="7.2"', 'te="303"', 'io="0.02"', 'seq="MKHPYEEFPTGSKSPYNMSRGAHPGAV"'])
34, File not properly written, try writing it up again, 
1

我可以从终端中调用相同的命令。
./tango_x86_64_release VTS1 ct="N" nt="N" ph="7.2" te="303" io="0.02" seq="MKHPYEEFPTGSKSPYNMSRGAHPGAV"

这个命令能够正常运行,并且退出状态码为0。

似乎是写入磁盘的问题导致了出现问题,如果我打断这个命令,那么会出现相应的警告信息(比如:移除一个参数,就会提示缺少该参数)。

使用subprocess.Popen()会产生一个OSError

import subprocess as sub
output = sub.Popen('./tango_x86_64_release VTS1 ct="N" nt="N" ph="7.2" te="303" io="0.02" seq="MKHPYEEFPTGSKSPYNMSRGAHPGAV"', stdout=sub.PIPE, stderr=sub.PIPE)

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python2.7/subprocess.py", line 679, in __init__
    errread, errwrite)
  File "/usr/lib64/python2.7/subprocess.py", line 1249, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

任何帮助都非常感激。

2
尝试在Popen调用中添加shell=True - alecxe
1
似乎很难在您的环境之外进行复制。尝试创建一个小的、可重现的用例可能会给您答案(有点像橡皮鸭调试)。 - Paulo Scardine
@alecxe - 你是我的英雄。一针见血(把它作为答案发布 - 我简直不敢相信只需要这么做!!) - Alex
@Alex 没问题。我只是找到了两个相关的主题,以下是提供给你的 - 那里的人才是你的英雄! - alecxe
2个回答

3
使用shlex.split来为您拆分命令:
import shlex
call(shlex.split('./tango_x86_64_release VTS1 ct="N" nt="N" ph="7.2" te="303" io="0.02" seq="MKHPYEEFPTGSKSPYNMSRGAHPGAV"'))

请注意,虽然您可能能够通过添加shell=True来解决问题,但如果可能的话应该避免使用它,因为它可能会成为安全风险(搜索"shell注入")。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接