【发布时间】:2011-04-25 08:55:46
【问题描述】:
根据文档,CreateProcess 可以传递一个可执行文件名 作为第一个参数,或命令行作为第二个参数(从中 可执行文件名将被提取)。
如果您传递一个可执行文件名称,文档中说PATH 将不会被搜索。
如果您改为传递命令行,则提取第一个令牌以供使用
作为可执行文件的名称,应该搜索PATH。
不过,就我而言,我对CreateProcess 的调用 --- 仅使用命令行并且
使用修改后的环境--- 找不到所需的可执行文件。它只是
如果我在命令行前面加上cmd.exe /c,则成功(我明白为什么
它是这样工作的)。
为了完整起见,我实际上并没有直接使用 Windows API,而是
subprocess.Popen 在 Python 中,虽然我认为我已经缩小了问题的范围
针对上述情况。使用shell = True,正确的环境是
已接;使用shell = False(我想要的创建子流程的方式),
该调用无法找到我的可执行文件。可执行文件是一个独立的 exe,而不是 cmd.exe 的内在命令。
谁能告诉我我在这里做错了什么或者我的误解在哪里?
示例代码:
from subprocess import Popen
import os, sys
exe = "wc.exe" # No other wc.exe on the PATH
env = os.environ.copy()
new_path = os.path.expandvars(r"%HOMEDRIVE%%HOMEPATH%\SmallApps\GnuWin32\bin;%PATH%")
env["PATH"] = os.path.expandvars(new_path).encode(sys.getfilesystemencoding())
Popen(
args=[exe, "*.*"],
env=env,
# shell=True # Works if you uncomment this line.
)
【问题讨论】:
-
由于 CreateProcess 和 cmd /c 都对您传递给它们的特定字节高度敏感,如果您包含用于尝试启动此进程的确切字符串,这可能会有所帮助。
-
添加了与实际代码类似的示例代码。
标签: python winapi subprocess