根据文档,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
看到它,您需要修改当前 进程的环境。目前,子 shell(无论是包含在命令行中还是通过 shell=True
请求)正在查看您修改后的环境,但是 CreateProcess
的直接调用不是。
关于python - CreateProcess 如何定位可执行文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5776789/