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

2024-04-18 10:35:11 发布

您现在位置: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代码调用它时,它可以工作,但是当它连接到oracledb时,它崩溃了。所以python代码似乎是对的,只是有一个因素或区别我不知道。你知道吗


Tags: 工具topath代码import可执行文件概念stdout
2条回答

嗯,你提供的信息真的不多。我会根据自己处理这种情况的经验来做一个猜测。你知道吗

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

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

  3. 如果您正在执行的程序是内置的windows shell应用程序(dir、copy等),请考虑在创建Popen对象时使用shell=True参见Popen constructor参考

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

用于在运行的Python应用程序中更改工作目录的代码。你知道吗

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

你应该使用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)

相关问题 更多 >