[英]Windows is not passing command line arguments to Python programs executed from the shell
如果我嘗試從 Windows 命令外殼將命令行參數作為可執行命令直接執行,則無法將命令行參數傳遞給 Python 程序。 例如,如果我有這個程序(test.py):
import sys
print "Args: %r" % sys.argv[1:]
並執行:
>test foo
Args: []
相比於:
>python test.py foo
Args: ['foo']
我的配置有:
PATH=...;C:\python25;...
PATHEXT=...;.PY;....
>assoc .py
.py=Python.File
>ftype | grep Python
Python.CompiledFile="C:\Python25\python.exe" "%1" %*
Python.File="C:\Python25\python.exe" "%1" %*
Python.NoConFile="C:\Python25\pythonw.exe" "%1" %*
我想我解決了這個問題。 出於某種原因,注冊表中有第二個位置(除了存儲在 HKEY_CLASSES_ROOT\\Python.File\\shell\\open\\command 中的文件關聯顯示的位置):
[HKEY_CLASSES_ROOT\Applications\python.exe\shell\open\command]
@="\"C:\\Python25\\python.exe\" \"%1\" %*"
這似乎是我系統上的控制設置。 上面的注冊表設置添加了“%*”以將所有參數傳遞給 python.exe(由於某種原因它在我的注冊表中丟失)。
我的設置位於另一個注冊表項HKEY_CLASSES_ROOT\\py_auto_file
。 提到的其他鍵也存在,但 Windows 出於某種原因使用了這個。
對於 Windows 7 上的 Python 3.3,我的設置在另一個注冊表項下; 我改變使參數通過的關鍵是
HKEY_USERS\\S-1-5-21-3922133726-554333396-2662258059-1000_Classes\\py_auto_file\\shell\\open\\command
它是"C:\\Python\\Python33\\python.exe" "%1"
。 我只將%*
附加到它。 鍵的值現在是"C:\\Python\\Python33\\python.exe" "%1" %*
。
我有幾個(至少五個)其他鍵的值為"C:\\Python\\Python33\\python.exe" "%1"
,但這是我更改的一個,使其工作。
以下是針對 Python 3.6、2.7 和 Anaconda3 修復的 .reg 文件:
python-3.6.0.reg
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\.py]
@="Python.File"
"Content Type"="text/plain"
[HKEY_CLASSES_ROOT\.pyc]
@="Python.CompiledFile"
"Content Type"="text/plain"
[HKEY_CLASSES_ROOT\.pyw]
@="Python.NoConFile"
"Content Type"="text/plain"
[HKEY_CLASSES_ROOT\py_auto_file]
[HKEY_CLASSES_ROOT\py_auto_file\DefaultIcon]
@="C:\\Python36\\DLLs\\py.ico"
[HKEY_CLASSES_ROOT\py_auto_file\shell\open\command]
@="\"C:\\Python36\\python.exe\" \"%1\" %*"
[HKEY_CLASSES_ROOT\Python.File]
@="Python File"
[HKEY_CLASSES_ROOT\Python.File\DefaultIcon]
@="C:\\Python36\\DLLs\\py.ico"
[HKEY_CLASSES_ROOT\Python.File\shell\open\command]
@="\"C:\\Python36\\python.exe\" \"%1\" %*"
[HKEY_CLASSES_ROOT\Python.CompiledFile]
@="Compiled Python File"
[HKEY_CLASSES_ROOT\Python.CompiledFile\DefaultIcon]
@="C:\\Python36\\DLLs\\pyc.ico"
[HKEY_CLASSES_ROOT\Python.CompiledFile\shell\open\command]
@="\"C:\\Python36\\python.exe\" \"%1\" %*"
[HKEY_CLASSES_ROOT\Python.NoConFile]
@="Python File (no console)"
[HKEY_CLASSES_ROOT\Python.NoConFile\DefaultIcon]
@="C:\\Python36\\DLLs\\py.ico"
[HKEY_CLASSES_ROOT\Python.NoConFile\shell\open\command]
@="\"C:\\Python36\\python.exe\" \"%1\" %*"
python-2.7.0.reg
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\.py]
@="Python.File"
"Content Type"="text/plain"
[HKEY_CLASSES_ROOT\.pyc]
@="Python.CompiledFile"
"Content Type"="text/plain"
[HKEY_CLASSES_ROOT\.pyw]
@="Python.NoConFile"
"Content Type"="text/plain"
[HKEY_CLASSES_ROOT\py_auto_file]
[HKEY_CLASSES_ROOT\py_auto_file\DefaultIcon]
@="C:\\Python27\\DLLs\\py.ico"
[HKEY_CLASSES_ROOT\py_auto_file\shell\open\command]
@="\"C:\\Python27\\python.exe\" \"%1\" %*"
[HKEY_CLASSES_ROOT\Python.File]
@="Python File"
[HKEY_CLASSES_ROOT\Python.File\DefaultIcon]
@="C:\\Python27\\DLLs\\py.ico"
[HKEY_CLASSES_ROOT\Python.File\shell\open\command]
@="\"C:\\Python27\\python.exe\" \"%1\" %*"
[HKEY_CLASSES_ROOT\Python.CompiledFile]
@="Compiled Python File"
[HKEY_CLASSES_ROOT\Python.CompiledFile\DefaultIcon]
@="C:\\Python27\\DLLs\\pyc.ico"
[HKEY_CLASSES_ROOT\Python.CompiledFile\shell\open\command]
@="\"C:\\Python27\\python.exe\" \"%1\" %*"
[HKEY_CLASSES_ROOT\Python.NoConFile]
@="Python File (no console)"
[HKEY_CLASSES_ROOT\Python.NoConFile\DefaultIcon]
@="C:\\Python27\\DLLs\\py.ico"
[HKEY_CLASSES_ROOT\Python.NoConFile\shell\open\command]
@="\"C:\\Python27\\python.exe\" \"%1\" %*"
ananconda3.reg (更改用戶名)
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\.py]
@="Python.File"
"Content Type"="text/plain"
[HKEY_CLASSES_ROOT\.pyc]
@="Python.CompiledFile"
"Content Type"="text/plain"
[HKEY_CLASSES_ROOT\.pyw]
@="Python.NoConFile"
"Content Type"="text/plain"
[HKEY_CLASSES_ROOT\py_auto_file]
[HKEY_CLASSES_ROOT\py_auto_file\DefaultIcon]
@="C:\\Users\\username\\Anaconda3\\DLLs\\py.ico"
[HKEY_CLASSES_ROOT\py_auto_file\shell\open\command]
@="\"C:\\Users\\username\\Anaconda3\\python.exe\" \"%1\" %*"
[HKEY_CLASSES_ROOT\Python.File]
@="Python File"
[HKEY_CLASSES_ROOT\Python.File\DefaultIcon]
@="C:\\Users\\username\\Anaconda3\\DLLs\\py.ico"
[HKEY_CLASSES_ROOT\Python.File\shell\open\command]
@="\"C:\\Users\\username\\Anaconda3\\python.exe\" \"%1\" %*"
[HKEY_CLASSES_ROOT\Python.CompiledFile]
@="Compiled Python File"
[HKEY_CLASSES_ROOT\Python.CompiledFile\DefaultIcon]
@="C:\\Users\\username\\Anaconda3\\DLLs\\pyc.ico"
[HKEY_CLASSES_ROOT\Python.CompiledFile\shell\open\command]
@="\"C:\\Users\\username\\Anaconda3\\python.exe\" \"%1\" %*"
[HKEY_CLASSES_ROOT\Python.NoConFile]
@="Python File (no console)"
[HKEY_CLASSES_ROOT\Python.NoConFile\DefaultIcon]
@="C:\\Users\\username\\Anaconda3\\DLLs\\py.ico"
[HKEY_CLASSES_ROOT\Python.NoConFile\shell\open\command]
@="\"C:\\Users\\username\\Anaconda3\\python.exe\" \"%1\" %*"
為了使它對我有用,我必須使用注冊表路徑:
HKEY_CLASSES_ROOT\py_auto_file\shell\open\command
並添加了一個%*
如果通過編輯以下注冊表項在我的 Windows 10 系統上修復此問題:
Computer\HKEY_CLASSES_ROOT\py_auto_file\shell\open\command
Computer\HKEY_CLASSES_ROOT\Python.File\Shell\Open\Command
Computer\HKEY_CLASSES_ROOT\Applications\python.exe\shell\open\command
到這個值:
"C:\Python27\python.exe" "%1" %*
非常感謝大多數其他答案幫助我找到解決方案!
我的情況是用py.exe
打開.py
-files(不是直接使用python.exe
),它在幾條評論中指出了這種情況,但我決定將其作為單獨的答案發布以強調差異。
所以我的.py
文件與C:\\Windows\\py.exe
py.exe 相關聯,在C:\\Windows\\py.ini
配置中我有幾個 shebang 定義
[commands]
<my_venv_py> = C:\Programs\my_venv_py\Scripts\python.exe
<my_venv_py_w> = C:\Programs\my_venv_py\Scripts\pythonw.exe
像這樣在我的腳本中使用#!<MY_VENV_PY>
。
在 Microsoft Windows 7 [版本 6.1.7601] 上,我的 python 腳本沒有收到這樣的參數
script.py 1 2
但這很好用
py script.py 1 2
文件關聯正常
> assoc .py
.py=Python.File
> ftype | grep Python
File STDIN:
Python.CompiledFile="C:\Windows\py.exe" "%1" %*
Python.File=C:\Windows\py.exe "%L" %*
Python.NoConFile="C:\Windows\pyw.exe" "%1" %*
我已經嘗試了很多注冊表更改,但最后一個幫助是以下更改(保存到.reg
文件並運行)。 我發現此注冊表項搜索具有初始值"C:\\Windows\\py.exe" "%1"
"%1"
字符串,並在最后添加了%*
作為其他答案注意:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\Applications\py.exe\shell\open\command]
@="\"C:\\Windows\\py.exe\" \"%1\" %*"
有關信息,在我嘗試設置這些鍵和值但沒有幫助之前(至少在上述之前):
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\.py]
@="Python.File"
[HKEY_CURRENT_USER\Software\Classes\.py]
@="Python.File"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.py]
@="Python.File"
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.py]
@="Python.File"
[HKEY_CLASSES_ROOT\py_auto_file]
@="Python File"
[HKEY_CLASSES_ROOT\py_auto_file\shell\open\command]
@="\"C:\\Windows\\py.exe\" \"%1\" %*"
[HKEY_CLASSES_ROOT\Python.File]
@="Python File"
[HKEY_CLASSES_ROOT\Python.File\Shell\Open\command]
@="\"C:\\Windows\\py.exe\" \"%1\" %*"
必須在 Windows 10 中修改它才能使其工作(最后為 %*)
計算機\\HKEY_USERS\\S-1-5-21-2364940108-955964078-1358188674-1001\\Software\\Classes\\Applications\\py.exe\\shell\\open\\command
有趣的。 在這里使用 python 2.6 和 Windows XP (5.1.2600) 工作:
C:\Documents and Settings\hbrown>python test.py foo
['test.py', 'foo']
C:\Documents and Settings\hbrown>test.py foo
['C:\\Documents and Settings\\hbrown\\test.py', 'foo']
C:\Documents and Settings\hbrown>test foo
['C:\\Documents and Settings\\hbrown\\test.py', 'foo']
C:\Documents and Settings\hbrown>type test.py
import sys
print sys.argv
C:\Documents and Settings\hbrown>echo %PATHEXT%
.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.PY
C:\Documents and Settings\hbrown>assoc .py
.py=Python.File
.py
文件的程序關聯可能會搞砸。 只需將.py
文件與您的 python 可執行文件重新關聯。
右鍵單擊.py
文件 > Open with
> Choose default program ...
> [find C:\\PythonXY\\python.exe]
我使用python.exe
和py_auto_file
檢查了所有注冊表項,並使它們指向我當前的 python 安裝,包括在最后傳遞參數的%*
。 他們有不少:
HKEY_CLASSES_ROOT\\Applications\\python.exe\\shell\\open\\command:
- 組織:“C:\\miniconda3\\python.exe”“%1”“%*”
- 更改:“C:\\Python35\\python.exe”“%1”“%*”
HKEY_CLASSES_ROOT\\py_auto_file\\shell\\open\\command
- org: "C:\\Program Files\\Sublime Text 3\\sublime_text.exe" "%1"
- 更改:“C:\\Python35\\python.exe”“%1”“%*”
HKEY_CURRENT_USER\\Software\\Classes\\py_auto_file\\shell\\open\\command
- 組織:“C:\\Python35\\python.exe”“%1”“%*”
HKEY_USERS\\S-1-5-21-2621213409-1291422344-4183577876-2165\\Software\\Classes\\py_auto_file\\shell\\open\\command
- 組織:“C:\\Python35\\python.exe”“%1”“%*”
HKEY_USERS\\S-1-5-21-2621213409-1291422344-4183577876-2165_Classes\\py_auto_file\\shell\\open\\command
- 組織:“C:\\Python35\\python.exe”“%1”“%*”
HKEY_CLASSES_ROOT\\Applications\\pythonw.exe\\shell\\open\\command
- 組織:“C:\\Python34\\pythonw.exe”“%1”
- 更改:“C:\\Python35\\pythonw.exe”“%1”“%*”
HKEY_CURRENT_USER\\Software\\Classes\\Applications\\python.exe\\shell\\open\\command
- 組織:“C:\\Python35\\python.exe”“%1”“%*”
但這對我沒有用。 我也必須更改我的默認 python 應用程序。
如您所見,我安裝了 3 個 Python 版本。 不可能在這里看到哪個是哪個,所以我嘗試了所有三個作為我的默認 python 應用程序。 最終,我能夠使用這三個參數之一獲取我的腳本參數。
通過查看 Windows 注冊表,我找到了所有類似Python36\\pythonw.exe "%1" %*
。
當我在命令提示符下鍵入python app.py args
時,一切正常。
當我只使用應用程序名稱 ( app.py args
) 時,Windows 會在 Python 中打開 app.py,但該應用程序在嘗試訪問 argv[1] 時失敗,因為 len(argv) 為 1。
顯然,Windows 知道足以將 py 文件傳遞給 Python,但我無法通過查看注冊表項來弄清楚它是如何構造命令的。 它似乎在使用"%1"
而不是"%1" %*
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.