根據文檔,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