根据文档,CreateProcess可以传递一个可执行文件名称 作为第一个参数,或命令行作为第二个参数(从中提取可执行文件名称 )。CreateProcess如何找到可执行文件?
如果您传递一个可执行文件的名称,文档说PATH
将不会被搜索。
如果您传递命令行,而第一个标记被提取为 作为可执行文件名,PATH
应被搜索。
在我的情况下,虽然我的电话号码是CreateProcess
---只带有一个命令行,而 带有一个修改过的环境---没有找到所需的可执行文件。它只有 成功,如果我在命令行前cmd.exe /c
(我明白为什么 它这样工作)。
为了完整起见,我实际上并没有直接使用Windows API,但在Python subprocess.Popen
,但我想我已经缩小的问题 上述情况。用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对传递给它们的特定字节都非常敏感,所以如果包含用于尝试启动此过程的确切字符串,可能会有所帮助。 – 2011-04-25 12:19:27
添加了与实际代码类似的示例代码。 – guillermooo 2011-04-25 13:04:59