python - CreateProcess 如何定位可执行文件?

标签 python winapi subprocess

根据文档,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/

相关文章:

python - ffmpeg|sed 命令的 subprocess.call 格式?

python - 在 django 1.11 中添加没有类别的博客文章

python - 警告 : Running pip as the 'root' user

python - 如何从 HTML 表单获取密码到我在 Django 中的 View

c++ - 使用 Tab 在编辑控件之间切换?

c++ - DirectX 9 高级教程 C++

Python 子进程帮助 - 不能使用 shell=true

python - subprocess.popen 和 psql

python - 以图形形式表示维基百科

c++ - 使用内存映射文件时如何释放物理内存?