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" %*
Python.File
w swoim rejestrze?[HKCU|HKLM]\SOFTWARE\Classes\Applications\python.exe
lub[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.File
ProgId. Sprawdźshell\open\command
podklucz 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" %*
.Odpowiedzi:
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).
źródło
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.źródło
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ł.źródło
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\" %*"
źródło
Aby to zadziałało, musiałem użyć ścieżki rejestru:
i dodał
%*
źródło
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
źródło
Twoje skojarzenia programów dla
.py
plików mogą być pomieszane. Po prostu ponownie skojarz.py
pliki z plikiem wykonywalnym Pythona.Kliknij prawym przyciskiem myszy na
.py
plik>Open with
>Choose default program ...
> [odnaleźć pliku C: \ PythonXY \ python.exe]źródło
Sprawdziłem wszystkie klucze rejestru za pomocą
python.exe
ipy_auto_file
wskazałem na moją obecną instalację Pythona, w tym%*
na końcu, który przekazuje argumenty. Było ich sporo:Ale to nie zadziałało dla mnie. Musiałem również zmienić moją domyślną aplikację w języku Python.
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.
źródło
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 args
w 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" %*
.źródło
Jeśli naprawiono to w moim systemie Windows 10, edytując następujące klucze rejestru:
do tej wartości:
"C:\Python27\python.exe" "%1" %*
źródło
Wielkie dzięki za większość innych odpowiedzi za pomoc w znalezieniu rozwiązania!
Mój przypadek polegał na otwarciu
.py
-plików zpy.exe
(niepython.exe
bezpoś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 zC:\Windows\py.exe
i wC:\Windows\py.ini
config Mam kilka definicji shebanguż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\" %*"
źródło
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
źródło