簡體   English   中英

Windows 沒有將命令行參數傳遞給從 shell 執行的 Python 程序

[英]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.exepy_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM