Python subprocess.call有效,但subprocess.check_call不起作用-有什么区别?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python subprocess.call有效,但subprocess.check_call不起作用-有什么区别?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3211字,纯文字阅读大概需要5分钟。
内容图文
![Python subprocess.call有效,但subprocess.check_call不起作用-有什么区别?](/upload/InfoBanner/zyjiaocheng/675/250e91b2bd294665bef01c2b9dc01c9e.jpg)
我正在使用Python 2.7
我正在尝试从Python运行StatTransfer程序.
当我尝试:
tempname = os.path.abspath('./text.txt')
TEMPFILE = open(tempname, 'wb')
try:
subprocess.check_call('ST convert.stc', shell = True, stdout = TEMPFILE, stderr = TEMPFILE)
except:
raise CritError(messages.crit_error_bad_command)
它失败(CritError是用户定义的).
追溯不会告诉我任何有用的信息:
Traceback (most recent call last):
File "C:\...\py\run_program.py", line 181, in run_stcmd
run.execute_run(current_directory, posix_command, nt_command)
File "C:\...\py\private\runprogramdirective.py", line 99, in execute_run
raise CritError(messages.crit_error_bad_command)
CritError: 'ERROR! Cannot execute command'
但是将相关行更改为:
subprocess.call('ST convert.stc', shell = True, stdout = TEMPFILE, stderr = TEMPFILE)
它运行成功.
有趣的是,在两种情况下,我的TEMPFILE都显示相同的内容:
|/-|/-|/-|/-|/- |/-|/-|/-|/-|/- Stat/Transfer - Command Processor (c) 1986-2011 Circle Systems, Inc.
www.stattransfer.com
Version 10.1.1866.0714 (32 Bit) - 64 Bit Windows
Serial: ADR4H-L3A3A-N8RJ
User: XXXXXXXXXXX
Your license is in its grace period -- Please call Circle Systems
Your program will die at the end of the month
Status: Temporarily OK (Expired May 31, 2012)
Transferring from SPSS Portable File: ..\orig\10908970\ICPSR_03775\DS0001\03775-0001- Data.por
Input file has 26 variables
Optimizing...
Transferring to Stata: ..\data\ABCFeb.dta
504 cases were transferred(0.02 seconds)
请注意,如果我从Windows命令行运行“ st convert.stc”,则它运行得很好,并提供与上面相同的日志消息.它确实实现了convert.stc中编写的内容.
这表明StatTransfer程序是通过subprocess.check_call调用的.但是,最后有一个错误.这是什么错误?如何避免呢?我应该使用2个命令中的哪个?为什么?
预计到达时间:在下面的mgilson之后,我从subprocess.call返回值并得到-1.这是什么意思?为什么程序仍然运行,但我似乎没有发现任何真正的错误?
关于如何在这里执行此操作的任何可能的解释和建议?
谢谢.
解决方法:
可能发生的情况是您的进程以非零退出状态退出.要进行检查,请使用retcode = subprocess.call(…)运行,然后打印retcode.
如果retcode(上述)非零,subprocess.check_call将引发异常.
您看到的异常来自try / except子句中的raise subprocess.CalledProcessError:
>>> import subprocess
>>> raise subprocess.CalledProcessError
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() takes exactly 3 arguments (1 given)
编辑
我仍然会重写try / except子句,因为您捕获了一个异常并引发了另一个异常(这意味着原始消息中的所有信息都丢失了).
尝试类似:
try:
subprocess.check_call('ST convert.stc', shell = True, stdout = TEMPFILE, stderr = TEMPFILE)
except Exception as e:
raise CritError(messages.crit_error_bad_command+' '+str(e))
这仍然会为您提供原始消息中的一些(不是全部)信息.问题可能仍然是您的子程序正在以非零的退出代码退出.也许没关系(请检查它是否已完成您想要的操作).
您说可以从命令行运行命令,一切看起来都很好.您也可以通过检查Windows命令行的退出状态(How do I get the application exit code from a Windows command line?)来确保行为相同.我猜测退出状态仍为-1-如果不是,则表明您的程序正在与环境(例如环境变量)进行交互,当您使用python进行调用时,环境有所不同.
最终,如果程序执行了您想要的操作,并且您不关心退出状态,那么您应该只使用subprocess.call,但是我建议您参考手册中的程序退出代码,看看有什么退出状态-1实际上意味着.
内容总结
以上是互联网集市为您收集整理的Python subprocess.call有效,但subprocess.check_call不起作用-有什么区别?全部内容,希望文章能够帮你解决Python subprocess.call有效,但subprocess.check_call不起作用-有什么区别?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。