Windows không chuyển các đối số dòng lệnh cho các chương trình Python được thực thi từ shell


87

Tôi đang gặp sự cố khi nhận các đối số dòng lệnh được chuyển đến các chương trình Python nếu tôi cố gắng thực thi chúng trực tiếp dưới dạng lệnh thực thi từ trình bao lệnh Windows. Ví dụ: nếu tôi có chương trình này (test.py):

import sys
print "Args: %r" % sys.argv[1:]

Và thực hiện:

>test foo
Args: []

so với:

>python test.py foo
Args: ['foo']

Cấu hình của tôi có:

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

Tuy nhiên nó làm việc cho tôi. C: \ Documents and Settings \ Quim> test foo Args: ['foo'] Tôi đã đặt test.py ở vị trí ban đầu cho cmd.exe (% HOMEDRIVE %% HOMEPATH% trong thuộc tính). Đối với phần còn lại, không có gì đặc biệt trong thiết lập của tôi: winxp, Activepython 2.6.5
joaquin

Bạn có thể vui lòng sử dụng RegScanner và tìm tất cả các lần xuất hiện Python.Filetrong sổ đăng ký của bạn không?
Piotr Dobrogost

2
Wow thật là một lỗi khó chịu :( Tôi vừa cài đặt lại Python và nó vẫn bị hỏng! Lỗi đã được báo cáo tại trình theo dõi vấn đề Python hai năm trước bug.python.org/issue7936 nhưng không có bản sửa lỗi nào - một số nhà phát triển sử dụng Windows.
Đại tá Panic

2
Lỗi này xảy ra khi tôi cài đặt python 3.4 và cố gắng sử dụng python 2.7. Có vẻ như trình cài đặt python 3.4 đã làm rối nó?
Dogmatixed

Nếu hệ thống đang sử dụng [HKCU|HKLM]\SOFTWARE\Classes\Applications\python.exehoặc [HKCU|HKLM\SOFTWARE\Classes\py_auto_file, thì nó được định cấu hình sai và các khóa vi phạm sẽ bị xóa. Sau đó, sử dụng Explorer ("mở bằng" hoặc ứng dụng cài đặt liên kết tệp) để chọn mục nhập "Python" chính xác sử dụng [HKCU|HKLM]\SOFTWARE\Classes\Python.FileProgId tiêu chuẩn . Kiểm tra shell\open\commandkhóa con trong regedit. Nếu Python 3 được cài đặt, mẫu lệnh sẽ sử dụng trình khởi chạy py. Nếu trình khởi chạy được cài đặt cho tất cả người dùng, thì mẫu phải được "C:\Windows\py.exe" "%1" %*.
Eryk Sun

Câu trả lời:


106

Tôi nghĩ rằng tôi đã giải quyết được điều này. Vì lý do nào đó, có một vị trí THỨ HAI trong sổ đăng ký (bên cạnh đó được hiển thị bởi các liên kết tệp được lưu trữ trong HKEY_CLASSES_ROOT \ Python.File \ shell \ open \ command):

[HKEY_CLASSES_ROOT\Applications\python.exe\shell\open\command]
@="\"C:\\Python25\\python.exe\" \"%1\" %*"

Đây dường như là cài đặt kiểm soát trên hệ thống của tôi. Cài đặt đăng ký ở trên thêm "% *" để chuyển tất cả các đối số vào python.exe (nó bị thiếu trong sổ đăng ký của tôi vì một số lý do).


8
Chìa khóa của tôi nằm ở đây trên Windows 7: HKEY_USERS \ S-1-5-21-2829634124-923609355-2255922086-1001 \ Software \ Classes \ Applications \ python.exe \ shell \ open \ command
Steven Keith

4
Với giá trị: C: \ Python26 \ python.exe% 1% *
Steven Keith

2
Làm việc cho tôi, hãy nhớ rằng câu trả lời của mckoss là thoát hoặc tệp .REG nếu bạn đang chỉnh sửa các giá trị đã xóa trực tiếp các thoát trong đó
fedmich

3
Một lưu ý nhỏ: Nguyên nhân gốc rễ của điều này có thể là do liên kết tệp ban đầu với tệp .py trước khi cài đặt Python. Chỉ gặp sự cố này, các tệp có kiểu .py đã được liên kết với Notepad và sau đó Python đã được cài đặt và vấn đề xấu xí này lại nổi lên đầu xấu xí của nó. Trên Windows 10 BTW.
g4m3c0d3r

2
Gần đây đã thay đổi trình khởi chạy để sử dụng C: \ Windows \ py.exe và gặp lỗi này. Tuy nhiên, tôi sửa đổi quan trọng trong phiên bản @ StevenKeith, với "py.exe" thay cho "python.exe"
Casey Kuball

14

Cài đặt của tôi nằm trong một khóa đăng ký khác HKEY_CLASSES_ROOT\py_auto_file,. Các khóa khác được đề cập cũng tồn tại, nhưng Windows đang sử dụng khóa này vì một số lý do.


10

Đối với Python 3.3 trên Windows 7, cài đặt của tôi nằm trong một khóa đăng ký khác; chìa khóa tôi đã thay đổi để làm cho các đối số được chuyển là

HKEY_USERS\S-1-5-21-3922133726-554333396-2662258059-1000_Classes\py_auto_file\shell\open\command

Nó đã được "C:\Python\Python33\python.exe" "%1". Tôi chỉ thêm vào %*nó. Giá trị của khóa bây giờ là "C:\Python\Python33\python.exe" "%1" %*.

Tôi đã có một số (ít nhất năm) khóa khác có giá trị "C:\Python\Python33\python.exe" "%1", nhưng đây là khóa tôi đã thay đổi khiến nó hoạt động.


5

Dưới đây là các tệp .reg cần sửa cho Python 3.6, 2.7 và Anaconda3:

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 (thay đổi tên người dùng)

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

4

Để làm cho nó hoạt động cho tôi, tôi phải sử dụng đường dẫn đăng ký:

HKEY_CLASSES_ROOT\py_auto_file\shell\open\command

và thêm một %*


0

Hấp dẫn. Hoạt động ở đây bằng cách sử dụng python 2.6 và 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

0

Các liên kết chương trình của bạn cho .pycác tệp có thể bị xáo trộn. Chỉ cần liên kết lại .pycác tệp với tệp thực thi python của bạn.

Nhấp chuột phải một .pyfile> Open with> Choose default program ...> [tìm C: \ PythonXY \ python.exe]


Không hoạt động trên hệ thống của tôi, vì nó luôn được mặc định là gọi Python 3.6. Các câu trả lời được lựa chọn làm việc
Aaron3468

Có vấn đề kể từ Windows10, vì vậy điều này không hoạt động luôn luôn.
rundekugel

0

Tôi đã kiểm tra tất cả các khóa đăng ký bằng python.exepy_auto_filevà làm cho chúng trỏ đến cài đặt python hiện tại của tôi bao gồm th %*ở cuối chuyển đối số. Họ khá ít:

  • HKEY_CLASSES_ROOT \ Applications \ python.exe \ shell \ open \ command:

    • org: "C: \ miniconda3 \ python.exe" "% 1" "% *"
    • đã thay đổi: "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"
    • đã thay đổi: "C: \ Python35 \ python.exe" "% 1" "% *"
  • HKEY_CURRENT_USER \ Software \ Classes \ py_auto_file \ shell \ open \ command

    • org: "C: \ Python35 \ python.exe" "% 1" "% *"
  • HKEY_USERS \ S-1-5-21-2621213409-1291422344-4183577876-2165 \ Software \ Classes \ py_auto_file \ shell \ open \ command

    • org: "C: \ Python35 \ python.exe" "% 1" "% *"
  • HKEY_USERS \ S-1-5-21-2621213409-1291422344-4183577876-2165_Classes \ py_auto_file \ shell \ open \ command

    • org: "C: \ Python35 \ python.exe" "% 1" "% *"
  • HKEY_CLASSES_ROOT \ Applications \ pythonw.exe \ shell \ open \ command

    • org: "C: \ Python34 \ pythonw.exe" "% 1"
    • đã thay đổi: "C: \ Python35 \ pythonw.exe" "% 1" "% *"
  • HKEY_CURRENT_USER \ Software \ Classes \ Applications \ python.exe \ shell \ open \ command

    • org: "C: \ Python35 \ python.exe" "% 1" "% *"

Nhưng điều đó không làm công việc cho tôi. Tôi cũng phải thay đổi ứng dụng python mặc định của mình.

Hộp thoại ứng dụng

Như mọi người có thể thấy, tôi đã cài đặt 3 phiên bản Python. Không thể thấy cái nào ở đây vì vậy tôi đã thử cả ba trong số chúng làm ứng dụng python mặc định của mình. Cuối cùng, tôi đã có thể nhận được các đối số kịch bản của mình với một trong ba điều này.


0

Bằng cách xem qua sổ đăng ký Windows, tôi đã tìm thấy tất cả những nơi mà bất kỳ thứ gì tương tự Python36\pythonw.exe "%1" %*xuất hiện.

Khi tôi nhập python app.py argsvào dấu nhắc lệnh, mọi thứ hoạt động bình thường.

Khi tôi chỉ sử dụng tên ứng dụng ( app.py args), Windows sẽ mở app.py bằng Python, nhưng ứng dụng không thành công khi cố truy cập vào argv [1], vì len (argv) là 1.

Rõ ràng Windows biết đủ để chuyển một tệp py sang Python, nhưng tôi không thể tìm ra khi xem các mục đăng ký cách nó xây dựng lệnh. Nó dường như được sử dụng "%1"hơn là "%1" %*.


0

Nếu đã khắc phục sự cố này trên hệ thống Windows 10 của tôi bằng cách chỉnh sửa các khóa đăng ký sau:

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

đến giá trị này:

"C:\Python27\python.exe" "%1" %*

0

Rất cảm ơn vì hầu hết các câu trả lời khác đã giúp tôi tìm ra giải pháp!

Trường hợp của tôi là mở tệp .pyvới py.exe(không python.exetrực tiếp), trường hợp này nó đã ghi nhận trong một vài nhận xét, nhưng tôi quyết định đăng điều này như một câu trả lời riêng để nhấn mạnh sự khác biệt.

Vì vậy, tôi có .py-files của mình được liên kết với C:\Windows\py.exevà trong C:\Windows\py.inicấu hình, tôi có một vài định nghĩa 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

để sử dụng trong các tập lệnh của tôi như thế này #!<MY_VENV_PY>.

Và trên Microsoft Windows 7 [Phiên bản 6.1.7601] tập lệnh python của tôi KHÔNG nhận được các hộp như thế này

script.py 1 2

nhưng điều này làm việc tốt

py script.py 1 2

Liên kết tệp ổn

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

Tôi đã thử nhiều thay đổi sổ đăng ký, nhưng sự giúp đỡ cuối cùng là thay đổi sau (được lưu vào .reg-tệp và chạy). Tôi đã tìm thấy "%1"chuỗi tìm kiếm khóa đăng ký này với giá trị ban đầu "C:\Windows\py.exe" "%1"và được thêm %*vào cuối như các câu trả lời khác lưu ý:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Applications\py.exe\shell\open\command]
@="\"C:\\Windows\\py.exe\" \"%1\" %*"

Để biết thông tin, trước khi tôi cố gắng thiết lập các khóa và giá trị này và không giúp được gì (ít nhất là trước khi được lưu ý ở trên):

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


0

Phải sửa đổi điều này trong Windows 10 để nó hoạt động (% * ở cuối)

Máy tính \ HKEY_USERS \ S-1-5-21-2364940108-955964078-1358188674-1001 \ Software \ Classes \ Applications \ py.exe \ shell \ open \ command

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.