Mam prosty skrypt blah.py (używając Pythona 2):
import sys
print sys.argv[1]
Jeśli wykonam skrypt przez:
python c:/..../blah.py argument
Wyświetla argument, ale jeśli wykonam skrypt przez:
blah.py argument
występuje błąd:
Błąd indeksu ...
Zatem argumenty nie przechodzą do skryptu.
python.exe w PATH. Folder z blah.py również w PATH.
python.exe jest domyślnym programem do wykonywania plików * .py.
Jaki jest problem?
Odpowiedzi:
Kiedy wykonujesz skrypt bez wpisywania „python” na początku, musisz wiedzieć dwie rzeczy o tym, jak Windows wywołuje program. Po pierwsze, należy dowiedzieć się, jakiego rodzaju plik jest według systemu Windows:
Następnie musisz wiedzieć, w jaki sposób system Windows wykonuje rzeczy z tym rozszerzeniem. Jest powiązany z typem pliku „Python.File”, więc to polecenie pokazuje, co będzie robić:
Więc na moim komputerze, kiedy napiszę "blah.py foo", wykona dokładnie to polecenie, bez różnicy w wynikach, niż gdybym sam wpisał pełną treść:
Jeśli wpiszesz to samo, łącznie z cudzysłowami, otrzymasz identyczne wyniki, jak po wpisaniu „blah.py foo”. Teraz możesz samodzielnie rozwiązać resztę problemu.
(Lub zamieść w swoim pytaniu bardziej przydatne informacje, takie jak rzeczywiste kopiowanie i wklejanie tego, co widzisz w konsoli. Pamiętaj, że osoby, które robią tego typu rzeczy, otrzymują głosowanie na ich pytania i punkty reputacji, a więcej osób prawdopodobnie pomogą im w udzieleniu dobrych odpowiedzi).
Sprowadzone z komentarzy:
Nawet jeśli assoc i ftype wyświetlają poprawne informacje, może się zdarzyć, że argumenty zostaną usunięte. W takim przypadku pomocne może być bezpośrednie naprawienie odpowiednich kluczy rejestru dla języka Python. Ustaw
klucz do:
"C:\Python26\python26.exe" "%1" %*
Prawdopodobnie wcześniej
%*
go brakowało. Podobnie ustawdo tej samej wartości. Zobacz http://eli.thegreenplace.net/2010/12/14/problem-passing-arguments-to-python-scripts-on-windows/
HKEY_CLASSES_ROOT\Applications\python.exe\shell\open\command
Ścieżka rejestru może się zmieniać, wykorzystywaćpython26.exe
lubpython.exe
czy cokolwiek jest już w rejestrze.HKEY_CLASSES_ROOT\py_auto_file\shell\open\command
źródło
assoc
iftype
wyświetlisz prawidłowe informacje, może się zdarzyć, że argumenty zostaną usunięte. W takim przypadku pomocne może być bezpośrednie naprawienie odpowiednich kluczy rejestru dla języka Python. UstawHKEY_CLASSES_ROOT\Applications\python26.exe\shell\open\command
klucz na:"C:\Python26\python26.exe" "%1" %*
Prawdopodobnie poprzednio%*
brakowało. Podobnie ustawHKEY_CLASSES_ROOT\py_auto_file\shell\open\command
tę samą wartość. Zobacz eli.thegreenplace.net/2010/12/14/…test.py 123
i123
drukuje jakosys.argv[1]
. Czy Microsoft coś zmienił?powinieneś ustawić domyślną aplikację do obsługi plików Pythona na python.exe.
kliknij prawym przyciskiem plik * .py, wybierz okno dialogowe „Otwórz za pomocą”. Tam wybierz „python.exe” i zaznacz „zawsze używaj tego programu dla tego typu plików” (coś w tym rodzaju).
wtedy twoje pliki Pythona będą zawsze uruchamiane przy użyciu python.exe
źródło
Dodatkowo, jeśli chcesz mieć możliwość uruchamiania skryptów Pythona bez wpisywania
.py
(lub.pyw
) na końcu nazwy pliku, musisz dodać.PY
(lub.PY;.PYW
) do listy rozszerzeń w zmiennej środowiskowej PATHEXT.W systemie Windows 7:
kliknij prawym przyciskiem myszy Komputer
kliknij
lewym przyciskiem myszy Właściwości kliknij lewym przyciskiem myszy Zaawansowane ustawienia systemu
kliknij lewym przyciskiem myszy kartę Zaawansowane
lewej kliknij przycisk Zmienne środowiskowe ...
pod „zmiennych systemowych” przewinąć w dół, aż zobaczysz PATHEXT
lewym przyciskiem myszy na PATHEXT aby podświetlić go
lewy- kliknij Edytuj ...
Edytuj "Wartość zmiennej" tak, aby zawierała
;.PY
(klawisz End przeskoczy do końca)kliknij
lewym przyciskiem OK kliknij
lewym przyciskiem OK kliknij lewym przyciskiem myszy OK
Uwaga nr 1: okna wiersza polecenia nie zobaczą zmiany bez zamknięcia i ponownego otwarcia.
Uwaga nr 2: różnica między rozszerzeniami
.py
i.pyw
polega na tym, że pierwszy z nich otwiera wiersz polecenia po uruchomieniu, a drugi nie.Na moim komputerze dodałem
;.PY;.PYW
jako ostatnie rozszerzenie (o najniższym priorytecie), więc wartości „before” i „after” PATHEXT były następujące:przed:
.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
po
.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY;.PYW
Oto kilka pouczających poleceń:
C:\>echo %pathext% .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY;.PYW C:\>assoc .py .py=Python.File C:\>ftype Python.File Python.File="C:\Python32\python.exe" "%1" %* C:\>assoc .pyw .pyw=Python.NoConFile C:\>ftype Python.NoConFile Python.NoConFile="C:\Python32\pythonw.exe" "%1" %* C:\>type c:\windows\helloworld.py print("Hello, world!") # always use a comma for direct address C:\>helloworld Hello, world! C:\>
źródło
Możesz zainstalować pylauncher . Służy do uruchamiania plików .py, .pyw, .pyc, .pyo i obsługuje wiele instalacji Pythona:
Możesz uruchomić skrypt Pythona bez podawania rozszerzenia .py, jeśli masz .py, .pyw w zmiennej środowiskowej PATHEXT:
Dodaje obsługę shebang (
#!
linia nagłówka), aby wybrać żądaną wersję Pythona w systemie Windows, jeśli masz zainstalowanych wiele wersji. Możesz użyć składni kompatybilnej z * nix#! /usr/bin/env python
.Możesz jawnie określić wersję, np. Aby uruchomić przy użyciu najnowszej zainstalowanej wersji Python 3:
T:\> py -3 blah.py argument
Powinno to również rozwiązać
sys.argv
problem jako efekt uboczny.źródło
Napotkałem ten sam problem, ale w kontekście potrzeby spakowania mojego kodu dla użytkowników systemu Windows (pochodzącego z systemu Linux). Mój pakiet zawiera wiele skryptów z opcjami wiersza poleceń.
Potrzebuję tych skryptów, aby zostały zainstalowane w odpowiedniej lokalizacji na komputerach użytkowników systemu Windows, aby mogli je wywoływać z wiersza poleceń. Ponieważ pakiet jest rzekomo przyjazny dla użytkownika, niemożliwe byłoby poproszenie moich użytkowników o zmianę rejestru w celu uruchomienia tych skryptów.
Natknąłem się na rozwiązanie, którego ludzie z Continuum używają do skryptów Pythona, które są dostarczane z pakietem Anaconda - przykłady można znaleźć w katalogu Anaconda / Scripts.
Dla skryptu w Pythonie
test
utwórz dwa pliki: atest.bat
i atest-script.py
.test.bat
wygląda następująco ( wywoływane.bat
pliki ze ścieżką względną, którą dostosowałem do swoich celów):Anaconda\Scripts
python.exe
@echo off set PYFILE=%~f0 set PYFILE=%PYFILE:~0,-4%-script.py "python.exe" "%PYFILE%" %*
test-script.py
to twój rzeczywisty skrypt w Pythonie:import sys print sys.argv
Jeśli zostawisz te dwa pliki w katalogu lokalnym, możesz wywołać skrypt Pythona za pośrednictwem tego
.bat
pliku, wykonująctest.bat hello world ['C:\\...\\test-scripy.py', 'hello', 'world']
Jeśli skopiujesz oba pliki do lokalizacji, która jest na twoim
PATH
(na przykładAnaconda\Scripts
), możesz nawet wywołać skrypt, pomijając.bat
przyrostektest hello world ['C:\\...Anaconda\\Scripts\\test-scripy.py', 'hello', 'world']
Zastrzeżenie: nie mam pojęcia, co się dzieje i jak to działa, więc byłbym wdzięczny za wszelkie wyjaśnienia.
źródło
.bat
opakowania dla każdego skryptu w Pythonie jest niezręczne i zbędne. Nie polecałbym tego.Na systemie Windows ,
Aby uruchomić moduł Pythona bez wpisywania „python” ,
-> Kliknij prawym przyciskiem myszy dowolny plik Pythona (*. Py)
-> Ustaw właściwość open with na „python.exe”
-> Zaznacz opcję „zawsze używaj tego programu dla tego typu plików”
-> Dołącz ścieżkę python.exe do zmiennego środowiska, np. Dołącz C: \ Python27 do zmiennej środowiskowej PATH.
Do uruchomić moduł Pythona bez wpisywania rozszerzenia „.py”
-> Edytuj zmienną systemową PATHEXT i dodaj rozszerzenie „.PY” do listy.
źródło
Znalazłem tutaj niezwykle przydatną odpowiedź : Jak uruchomić różne wersje Pythona w cmd?
Jak sugeruje JF Sebastian, Python Launcher dla Windows jest najlepszym i domyślnym wyborem do uruchamiania różnych wersji Pythona w systemie Windows. Wcześniej było to narzędzie innej firmy, ale teraz jest oficjalnie obsługiwane od wersji Python 3.3.
To świetne narzędzie, po prostu go używaj!
źródło
Czy możesz uruchomić python.exe z dowolnej mapy? Jeśli nie, sprawdź, czy masz odpowiednie wartości dla python.exe w środowisku PATH
Czy jesteś w tym samym katalogu co blah.py. Sprawdź to, wydając polecenie -> edytuj blah.py i sprawdź, czy możesz otworzyć ten plik
EDYTOWAĆ:
W takim przypadku nie możesz. ( python arg oznacza, że wywołujesz python.exe z niektórymi parametrami, które python zakłada, że jest to nazwa pliku skryptu, który chcesz uruchomić)
Możesz utworzyć plik bat z liniami w mapie ścieżki i uruchomić plik .bat
Przykład:
W jednej z map ścieżek utwórz plik blah.py.bat Edytuj i wstaw linię
Możesz teraz uruchomić blah.py z dowolnego miejsca, ponieważ nie musisz dodawać rozszerzenia .bat podczas uruchamiania plików bat
źródło
Jeśli to właśnie zrozumiałem, wygląda to tak:
KOPIUJ (nie usuwaj) python.exe i zmień nazwę na py.exe i wykonaj:
źródło
Po prostu uruchom polecenie:
Zakładając, że nazwa pliku znajduje się w tym samym folderze, a Python został już dodany do zmiennych środowiskowych.
źródło