从windows cmd行和python调用命令之间的奇怪区别

时间:2014-11-04 13:40:41

标签: python

在我的python代码中管理第三方可执行文件时,我有一种奇怪的行为。从概念上讲,我在python中有以下代码:

import subprocess
p = subprocess.Popen([r'c:\path\to\programme.exe', '-d'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()
print p.returncode, out, err

该工具崩溃显示在out其追溯中,并返回错误代码,表示"未处理的异常"。我试过一个简单的os.system(...),结果相同。

但是,这里有趣的部分,当我只是将命令粘贴到Windows shell中时,它完美地工作......

C:\> c:\path\to\programme.exe -d

python解释器是32位2.7.2版本。

那么......导致崩溃的这两个电话之间的区别是什么?提前谢谢。

额外信息

我不太确定这是否有帮助,但是这个外部工具连接到数据库并执行一些操作。使用一些RDBMS时,它可以在从python代码调用时工作,但是当它连接到Oracle DB时,它会崩溃。所以python代码似乎是正确的,只有一个因素或差异,我不知道。

2 个答案:

答案 0 :(得分:2)

嗯,你真的没有提供太多信息。我会根据自己处理这类情况的经验做出猜测。

  1. 如果第三方应用程序需要priveleges,请确保您以管理员身份运行Python应用程序。

  2. 检查工作目录是否有问题。意思是,如果程序打开某个文件或以任何方式引用某个相对路径,则必须在从python执行时更改工作目录。 请参阅下面的代码,了解如何执行此操作。

  3. 如果您正在执行的程序是内置的Windows shell应用程序(目录,副本等),请考虑在创建shell=True对象时使用Popen请参阅Popen constructor参考

  4. Python设置或修改第三方应用程序所需/使用的某些环境变量。

  5. 在正在运行的Python应用程序中更改工作目录的代码。

    import os
    os.chdir('/path_you_need/python/work_from')
    

答案 1 :(得分:0)

您应该使用raw string

p = subprocess.Popen([r'c:\path\to\programme.exe', '-d'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

否则您可以使用\\而不是像raw string这样使用: -

p = subprocess.Popen(['c:\\path\\to\\programme.exe', '-d'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)