Windows没有将命令行参数传递给从shell执行的Python程序

Windows没有将命令行参数传递给从shell执行的Python程序,python,windows,registry,command-line-arguments,file-association,Python,Windows,Registry,Command Line Arguments,File Association,如果我试图将命令行参数作为Windows命令shell中的可执行命令直接执行,则很难将其传递给Python程序。例如,如果我有这个程序(test.py): 并执行: >test foo Args: [] 与之相比: >python test.py foo Args: ['foo'] 我的配置有: PATH=...;C:\python25;... PATHEXT=...;.PY;.... >assoc .py .py=Python.File >ftype | gre

如果我试图将命令行参数作为Windows命令shell中的可执行命令直接执行,则很难将其传递给Python程序。例如,如果我有这个程序(test.py):

并执行:

>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" %*

有趣。使用python 2.6和Windows XP(5.1.2600)在此处工作:


我想我解决了这个问题。出于某种原因,注册表中还有第二个位置(除了HKEY_CLASSES_ROOT\Python.file\shell\open\command中存储的文件关联所显示的位置之外):


这似乎是我的系统上的控制设置。上面的注册表设置添加了“%*”以将所有参数传递给python.exe(由于某种原因,我的注册表中缺少该参数)。

我的设置位于另一个注册表项下,
HKEY\U CLASSES\U ROOT\py\U auto\U 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”
,但这是我更改的使其工作的键。

要使其工作,我必须使用注册表路径:

HKEY_CLASSES_ROOT\py_auto_file\shell\open\command

并添加了一个
%*
您的
.py
文件的程序关联可能会出错。只需将
.py
文件与python可执行文件重新关联即可


右键单击
.py
文件>
用打开
选择默认程序…
[find C:\PythonXY\python.exe]

我用
python.exe
py_auto_文件
检查了所有注册表项,并使它们指向我当前的python安装,包括传递参数的末尾的th
%*
。他们相当多:

  • HKEY\U CLASSES\U ROOT\Applications\python.exe\shell\open\command:

    • 组织:“C:\miniconda3\python.exe”“%1”“%*”
    • 更改:“C:\Python35\python.exe”“%1”“%*”
  • HKEY\U CLASSES\U ROOT\py\U auto\U file\shell\open\command

    • 组织:“C:\Program Files\Sublime Text 3\Sublime_Text.exe”“%1”
    • 更改:“C:\Python35\python.exe”“%1”“%*”
  • HKEY\U CURRENT\U USER\Software\Classes\py\U auto\U file\shell\open\command

    • 组织:“C:\Python35\python.exe”“%1”“%*”
  • HKEY_用户\S-1-5-21-2621213409-1291422344-4183577876-2165\Software\Classes\py_auto_file\shell\open\command

    • 组织:“C:\Python35\python.exe”“%1”“%*”
  • HKEY_用户\S-1-5-21-2621213409-1291422344-4183577876-2165_类\py_自动_文件\shell\open\command

    • 组织:“C:\Python35\python.exe”“%1”“%*”
  • HKEY\U CLASSES\U ROOT\Applications\pythonw.exe\shell\open\command

    • 组织:“C:\Python34\pythonw.exe”“%1”
    • 更改:“C:\Python35\pythonw.exe”“%1”“%*”
  • HKEY\U CURRENT\U USER\Software\Classes\Applications\python.exe\shell\open\command

    • 组织:“C:\Python35\python.exe”“%1”“%*”
但这对我来说不起作用。我还必须更改默认的python应用程序


可以看到,我安装了3个Python版本。这里不可能看到哪一个是哪一个,所以我尝试了这三个作为我的默认python应用程序。最终,我能够使用这三个参数中的一个获取脚本参数。

以下是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

ananconda3.reg(更改用户名)


通过查看Windows注册表,我找到了所有类似的地方
Python36\pythonw.exe“%1”%*
出现

在命令提示下键入
python app.py args
时,一切正常

当我只使用应用程序名(
app.py args
)时,Windows会以Python打开app.py,但应用程序在尝试访问argv[1]时失败,因为len(argv)是1


显然,Windows知道如何将py文件传递给Python,但我无法通过查看注册表项了解它是如何构造命令的。如果通过编辑以下注册表项在我的Windows 10系统上修复了此问题,则它似乎正在使用
%1“
而不是
%1”%*

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
(不是直接
python.exe
)打开
.py
——文件,这个案例在几条评论中提到了,但我决定将其作为一个单独的答案发布,以强调区别

因此,我有我的
.py
-文件与
C:\Windows\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
但这很有效

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
-文件并运行)。我在搜索
“%1”
字符串时发现此注册表项的初始值为
“C:\Windows\py.exe”“%1”
,并在最后添加了
%*
,作为其他答案注意:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Applications\py.exe\shell\open\command]
@="\"C:\\Windows\\py.exe\" \"%1\" %*"
请注意,在我尝试设置这些键和值但没有帮助之前(至少在上述操作之前):


必须在Windows 10中对此进行修改以使其正常工作(最后为%*

计算机\HKEY_用户\S-1-5-21-2364940108-955964078-1358188674-1001\软件\Classes\
"C:\Python27\python.exe" "%1" %*
[commands]
<my_venv_py> = C:\Programs\my_venv_py\Scripts\python.exe
<my_venv_py_w> = C:\Programs\my_venv_py\Scripts\pythonw.exe
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" %*
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\" %*"