Согласно документации, 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.
)