System Windows nie przekazuje argumentów wiersza poleceń do programów w języku Python wykonywanych z powłoki

87

Mam problem z uzyskaniem argumentów wiersza poleceń przekazywanych do programów w języku Python, jeśli próbuję wykonać je bezpośrednio jako polecenia wykonywalne z powłoki poleceń systemu Windows. Na przykład, jeśli mam ten program (test.py):

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

I wykonaj:

>test foo
Args: []

w porównaniu do:

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

Moja konfiguracja obejmuje:

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" %*
mckoss
źródło
Jednak to działa dla mnie. C: \ Documents and Settings \ Quim> test foo Args: ['foo'] Umieściłem test.py w początkowej lokalizacji dla cmd.exe (% HOMEDRIVE %% HOMEPATH% we właściwościach). Co do reszty, w mojej konfiguracji nie ma nic specjalnego: winxp, Activepython 2.6.5
joaquin
Czy mógłbyś użyć RegScanner i znaleźć wszystkie wystąpienia Python.Filew swoim rejestrze?
Piotr Dobrogost
2
Wow, co za frustrujący błąd :( Właśnie ponownie zainstalowałem Pythona i nadal jest uszkodzony! Błąd został zgłoszony w narzędziu do śledzenia problemów Pythona dwa lata temu bugs.python.org/issue7936, ale nie ma rozwiązania - niewielu programistów używa systemu Windows.
Colonel Panic
2
Wpadłem na to, gdy zainstalowałem Pythona 3.4 i próbowałem użyć Pythona 2.7. Wygląda na to, że instalator Pythona 3.4 zawalił sprawę?
Dogmatixed
Jeśli system używa [HKCU|HKLM]\SOFTWARE\Classes\Applications\python.exelub [HKCU|HKLM\SOFTWARE\Classes\py_auto_file, oznacza to, że jest źle skonfigurowany i należy usunąć naruszające klucze. Następnie użyj Eksploratora („otwórz za pomocą” lub aplikacji ustawień skojarzeń plików), aby wybrać poprawny wpis „Python”, który używa standardowego [HKCU|HKLM]\SOFTWARE\Classes\Python.FileProgId. Sprawdź shell\open\commandpodklucz w regedit. Jeśli jest zainstalowany Python 3, szablon poleceń powinien używać programu uruchamiającego py. Jeśli program uruchamiający jest zainstalowany dla wszystkich użytkowników, szablon powinien mieć postać "C:\Windows\py.exe" "%1" %*.
Eryk Sun

Odpowiedzi:

106

Myślę, że rozwiązałem to. Z jakiegoś powodu w rejestrze znajduje się DRUGIE miejsce (poza tym, które pokazują skojarzenia plików przechowywane w HKEY_CLASSES_ROOT \ Python.File \ shell \ open \ command):

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

Wydaje się, że jest to ustawienie kontrolne w moim systemie. Powyższe ustawienie rejestru dodaje „% *”, aby przekazać wszystkie argumenty do python.exe (z jakiegoś powodu brakowało go w moim rejestrze).

mckoss
źródło
8
Mój klucz znajduje się tutaj w systemie Windows 7: HKEY_USERS \ S-1-5-21-2829634124-923609355-2255922086-1001 \ Software \ Classes \ Applications \ python.exe \ shell \ open \ command
Steven Keith
4
Z wartością: C: \ Python26 \ python.exe% 1% *
Steven Keith
2
Pracowałem dla mnie, pamiętaj, że odpowiedź mckossa jest ucieczką lub plik .REG, jeśli edytujesz wartości, bezpośrednio
usuwasz znaki specjalne
3
Na marginesie: główną przyczyną tego może być początkowe skojarzenie plików z plikami .py przed instalacją Pythona. Właśnie natknąłem się na ten problem, pliki typu .py zostały skojarzone z Notatnikiem, a następnie zainstalowano Pythona, a ten brzydki problem podniósł brzydką głowę. W systemie Windows 10 BTW.
g4m3c0d3r
2
Niedawno zmieniłem program uruchamiający na C: \ Windows \ py.exe i natrafiłem na ten błąd. Jednak zmodyfikowałem klucz w wersji @ StevenKeith, w którym „py.exe” zastąpiono „python.exe”
Casey Kuball
14

Moje otoczenie było pod jeszcze innym kluczu rejestru HKEY_CLASSES_ROOT\py_auto_file. Pozostałe wspomniane klucze również istniały, ale system Windows z jakiegoś powodu używał tego klucza.

bainorama
źródło
10

W przypadku języka Python 3.3 w systemie Windows 7 moje ustawienie znajdowało się w innym kluczu rejestru; klucz, który zmieniłem, aby argumenty były przekazywane, to

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

To było "C:\Python\Python33\python.exe" "%1". Tylko się %*do tego dołączyłem . Wartość klucza to teraz "C:\Python\Python33\python.exe" "%1" %*.

Miałem kilka (co najmniej pięć) innych kluczy z wartością "C:\Python\Python33\python.exe" "%1", ale to ten, który zmieniłem, sprawił, że zadziałał.

Cody Piersall
źródło
5

Oto pliki .reg do naprawienia dla Pythona 3.6, 2.7 i 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 (zmień nazwę użytkownika)

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\" %*"
iki
źródło
4

Aby to zadziałało, musiałem użyć ścieżki rejestru:

HKEY_CLASSES_ROOT\py_auto_file\shell\open\command

i dodał %*

rundekugel
źródło
0

Ciekawy. Działa tutaj przy użyciu Pythona 2.6 i 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
hughdbrown
źródło
0

Twoje skojarzenia programów dla .pyplików mogą być pomieszane. Po prostu ponownie skojarz .pypliki z plikiem wykonywalnym Pythona.

Kliknij prawym przyciskiem myszy na .pyplik> Open with> Choose default program ...> [odnaleźć pliku C: \ PythonXY \ python.exe]

congusbongus
źródło
Nie działał w moim systemie, ponieważ zawsze domyślnie wywoływał Python 3.6. Wybrana odpowiedź nie działa
Aaron3468
Występują problemy od czasu Windows10, więc to nie zawsze działa.
rundekugel
0

Sprawdziłem wszystkie klucze rejestru za pomocą python.exei py_auto_filewskazałem na moją obecną instalację Pythona, w tym %*na końcu, który przekazuje argumenty. Było ich sporo:

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

    • org: "C: \ miniconda3 \ python.exe" "% 1" "% *"
    • zmieniono: „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"
    • zmieniono: „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”
    • zmieniono: „C: \ Python35 \ pythonw.exe” „% 1” „% *”
  • HKEY_CURRENT_USER \ Software \ Classes \ Applications \ python.exe \ shell \ open \ command

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

Ale to nie zadziałało dla mnie. Musiałem również zmienić moją domyślną aplikację w języku Python.

Okno aplikacji

Jak widać, mam zainstalowane 3 wersje Pythona. Nie można zobaczyć, który jest który, więc wypróbowałem wszystkie trzy jako moją domyślną aplikację w Pythonie. W końcu udało mi się uzyskać argumenty ze scenariusza za pomocą jednego z tych trzech.

MrLeeh
źródło
0

Przeglądając rejestr systemu Windows, znalazłem wszystkie miejsca, w których Python36\pythonw.exe "%1" %*pojawia się coś podobnego .

Kiedy piszę python app.py argsw wierszu polecenia, wszystko działa poprawnie.

Kiedy używam tylko nazwy aplikacji ( app.py args), Windows otwiera app.py w Pythonie, ale aplikacja kończy się niepowodzeniem, gdy próbuje uzyskać dostęp do argv [1], ponieważ len (argv) ma wartość 1.

Wygląda na to, że system Windows wie wystarczająco dużo, aby przekazać plik py do Pythona, ale nie mogę dowiedzieć się, patrząc na wpisy rejestru, jak konstruuje polecenie. Wydaje się, że używa "%1"zamiast "%1" %*.

Richard Mateosian
źródło
0

Jeśli naprawiono to w moim systemie Windows 10, edytując następujące klucze rejestru:

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

do tej wartości:

"C:\Python27\python.exe" "%1" %*
stuw
źródło
0

Wielkie dzięki za większość innych odpowiedzi za pomoc w znalezieniu rozwiązania!

Mój przypadek polegał na otwarciu .py-plików z py.exe(nie python.exebezpośrednio), ten przypadek odnotowano w kilku komentarzach, ale postanowiłem opublikować to jako oddzielną odpowiedź, aby podkreślić różnicę.

Więc ja mam .py-files związany z C:\Windows\py.exei w C:\Windows\py.iniconfig Mam kilka definicji 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

używać w moich skryptach w ten sposób #!<MY_VENV_PY>.

A na Microsoft Windows 7 [wersja 6.1.7601] mój skrypt Pythona NIE otrzymał takich argumentów

script.py 1 2

ale to działało dobrze

py script.py 1 2

Powiązania plików były w porządku

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

Próbowałem wielu zmian w rejestrze, ale ostatnią pomogła była następująca zmiana (zapisana do pliku .reg-file i uruchom). Znalazłem ten "%1"ciąg wyszukiwania klucza rejestru z wartością początkową "C:\Windows\py.exe" "%1"i dodałem %*na końcu jako uwagę innych odpowiedzi:

Windows Registry Editor Version 5.00

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

Dla informacji, zanim spróbowałem ustawić te klucze i wartości i nie pomogło (przynajmniej przed wspomnianym powyżej):

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

and1er
źródło
0

Musiałem to zmodyfikować w systemie Windows 10, aby działało (% * na końcu)

Komputer \ HKEY_USERS \ S-1-5-21-2364940108-955964078-1358188674-1001 \ Software \ Classes \ Applications \ py.exe \ shell \ open \ command

Arunex
źródło