Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
与Python子进程的混淆_Python_Subprocess - Fatal编程技术网

与Python子进程的混淆

与Python子进程的混淆,python,subprocess,Python,Subprocess,我试图从Python中运行一些外部可执行代码,然后利用输出。我使用的代码获取一个外部文件并返回一个数字(该文件中编码的图像数)。从命令行运行时,我会看到以下内容: me@ubuntu:~/nist/hsfsys/bin$ ./nummis /usr/local/hsfsys/data/by_class/4a/train_4a.mis 3962 其中3962是一个正确的输出,就我所知 但是,当我尝试在Python中使用子流程时,会出现以下错误: me@ubuntu:~/nist/hsfsys

我试图从Python中运行一些外部可执行代码,然后利用输出。我使用的代码获取一个外部文件并返回一个数字(该文件中编码的图像数)。从命令行运行时,我会看到以下内容:

me@ubuntu:~/nist/hsfsys/bin$ ./nummis  /usr/local/hsfsys/data/by_class/4a/train_4a.mis 
3962
其中3962是一个正确的输出,就我所知

但是,当我尝试在Python中使用子流程时,会出现以下错误:

me@ubuntu:~/nist/hsfsys/bin$ python
Python 2.7.3 (default, Apr 20 2012, 22:39:59) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import subprocess
>>> subprocess.check_output(["./nummis","/usr/local/hsfsys/data/by_class/4a/train_4a.mis"])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/subprocess.py", line 544, in check_output
raise CalledProcessError(retcode, cmd, output=output)
subprocess.CalledProcessError: Command '['./nummis', '/usr/local/hsfsys/data/by_class/4a/train_4a.mis']' returned non-zero exit status 32
>>> subprocess.call(["./nummis","/usr/local/hsfsys/data/by_class/4a/train_4a.mis"])
3962
32
me@ubuntu:~/nist/hsfsys/bin$python
Python 2.7.3(默认值,2012年4月20日,22:39:59)
[GCC 4.6.3]关于linux2
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>导入子流程
>>>子流程检查_输出([“/numis”,“/usr/local/hsfsys/data/by_class/4a/train_4a.mis”])
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/usr/lib/python2.7/subprocess.py”,第544行,在check_输出中
引发被调用的进程错误(retcode,cmd,output=output)
subprocess.CalledProcessError:命令'['./numis','/usr/local/hsfsys/data/by_class/4a/train4a.mis']'返回非零退出状态32
>>>子流程调用([“/numis”,“/usr/local/hsfsys/data/by_class/4a/train_4a.mis”])
3962
32

我应该如何解释这种“非零退出状态32”?如果出现问题,为什么我不能在命令行上看到它?如果没有问题,Python为什么会抱怨&我如何才能让它停止抱怨?

命令行仅在明确要求退出状态时报告退出状态

从命令行调用程序后,请重试

echo $?

以显示退出状态。如果它也显示
32
,则被调用的程序是有罪的。它没有正确地
返回0
返回退出成功
在其
main()

中,您看到的行为如子流程的文档所示。check\u call()函数。我想您有两个主要的选择:在异常处理程序中包装调用,或者使用subprocess.Popen并提供自己的处理(check_output()是一些.Popen()代码的包装器)。另一种相当复杂的方法是调用['/bin/sh','-c',您的_命令您的_参数;退出0'],强制子进程返回零,而不管您的命令返回什么。但这有点傻。(您也可以根据需要重新编写“nummis”命令以返回EXIT_SUCCESS)@Jim Dennis谢谢。使用p=subprocess.Popen(..,stdout=subprocess.PIPE),然后使用z=p.communicate()可以访问想要的输出。echo$?根据/usr/include/asm generic/errno base.h显示32。意味着有一根断了的管子。谢谢。@user1245262只有当程序显式返回
errno
的值时,此查找才有效。否则,返回代码的含义取决于程序本身。