Jak wykonywać skrypty Pythona w systemie Windows?


92

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?


3
zamieszczenie fragmentu kodu może nam pomóc.
jldupont

Człowiek bez kryształowej kuli podał już rozwiązanie =) print sys.argv [1] powoduje ten błąd.
ton4eg

Jeśli masz zainstalowanych wiele wersji Pythona, możesz potrzebować tego stackoverflow.com/questions/1934675/… .
laike9m

Ręcznie powiedz Pythonowi, aby uruchomił mój skrypt z rejestru: "C: \ Python27 \ python.exe" "C: \ Python27 \ tpt.py" "% 1" `

Odpowiedzi:


144

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:

    C: \> assoc .py
    .py = Python.File

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ć:

    C: \> ftype Python.File
    Python.File = "c: \ python26 \ python.exe" "% 1"% *

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ść:

    „c: \ python26 \ python.exe” „blah.py” foo

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

HKEY_CLASSES_ROOT\Applications\python26.exe\shell\open\command

klucz do:

"C:\Python26\python26.exe" "%1" %*

Prawdopodobnie wcześniej %*go brakowało. Podobnie ustaw

 HKEY_CLASSES_ROOT\py_auto_file\shell\open\command

do tej samej wartości. Zobacz http://eli.thegreenplace.net/2010/12/14/problem-passing-arguments-to-python-scripts-on-windows/

przykładowe ustawienie rejestru dla python.exe HKEY_CLASSES_ROOT\Applications\python.exe\shell\open\commandŚcieżka rejestru może się zmieniać, wykorzystywać python26.exelub python.execzy cokolwiek jest już w rejestrze.

wprowadź opis obrazu tutaj HKEY_CLASSES_ROOT\py_auto_file\shell\open\command


30
Nawet jeśli associ ftypewyś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. Ustaw HKEY_CLASSES_ROOT\Applications\python26.exe\shell\open\commandklucz na: "C:\Python26\python26.exe" "%1" %* Prawdopodobnie poprzednio %*brakowało. Podobnie ustaw HKEY_CLASSES_ROOT\py_auto_file\shell\open\commandtę samą wartość. Zobacz eli.thegreenplace.net/2010/12/14/…
parvus

5
@parvus Twój komentarz był dla mnie najlepszym rozwiązaniem. Nawet przy prawidłowym odczytywaniu skojarzeń oba te klucze były nieprawidłowo ustawione.
Nathan Cox,

1
Napotkałem również problemy z ustawieniem HKEY_CLASSES_ROOT \ .py \ OpenWithProgids na coś związanego z VisualStudio, szczególnie gdy próbuję uruchomić skrypty Pythona w moich testach AppVeyor. Zobacz help.appveyor.com/discussions/problems/… .
Jack O'Connor,

1
Mam podobny problem. Anaconda domyślnie dodała klucz rejestru z brakującym% *
prasad

W Win10 piszę test.py 123i 123drukuje jako sys.argv[1]. Czy Microsoft coś zmienił?
Hrvoje T

22

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


16

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 .pyi .pywpolega na tym, że pierwszy z nich otwiera wiersz polecenia po uruchomieniu, a drugi nie.

Na moim komputerze dodałem ;.PY;.PYWjako 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:\>

4

Jak wykonywać skrypty Pythona w systemie Windows?

Możesz zainstalować pylauncher . Służy do uruchamiania plików .py, .pyw, .pyc, .pyo i obsługuje wiele instalacji Pythona:

T\:> blah.py argument

Możesz uruchomić skrypt Pythona bez podawania rozszerzenia .py, jeśli masz .py, .pyw w zmiennej środowiskowej PATHEXT:

T:\> blah argument

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.argvproblem jako efekt uboczny.


Python Launcher jest w fazie beta.
Nicolas Barbulesco

@NicolasBarbulesco: Program uruchamiający Python jest zawarty w Pythonie 3.3, tj. Jest wystarczająco dobry
jfs


4

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 testutwórz dwa pliki: a test.bati atest-script.py .

test.batwygląda następująco ( wywoływane .batpliki ze ścieżką względną, którą dostosowałem do swoich celów):Anaconda\Scriptspython.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 .batpliku, wykonując

test.bat hello world
['C:\\...\\test-scripy.py', 'hello', 'world']

Jeśli skopiujesz oba pliki do lokalizacji, która jest na twoim PATH(na przykład Anaconda\Scripts), możesz nawet wywołać skrypt, pomijając .batprzyrostek

test 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.


Tworzenie .batopakowania dla każdego skryptu w Pythonie jest niezręczne i zbędne. Nie polecałbym tego.
tripleee

2

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.


1

Znalazłem tutaj niezwykle przydatną odpowiedź : Jak uruchomić różne wersje Pythona w cmd?

Sugerowałbym użycie narzędzia Python Launcher for Windows, które wprowadzono jakiś czas temu w Pythonie 3.3. Możesz również ręcznie pobrać i zainstalować go bezpośrednio z witryny internetowej autora do użytku z wcześniejszymi wersjami Pythona 2 i 3.

Niezależnie od tego, w jaki sposób go uzyskasz, po instalacji będzie on powiązany ze wszystkimi standardowymi rozszerzeniami plików Pythona (tj. Z plikami .py, .pyw, .pyc i .pyo). Będziesz mógł nie tylko jawnie kontrolować, która wersja jest używana w wierszu polecenia, ale także na podstawie skryptu po skrypcie, dodając komentarze Linux / Unix-y shebang #! / Usr / bin / env pythonX w początek twoich skryptów Pythona.

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.

Nowość w wersji 3.3.

Program uruchamiający Python dla Windows to narzędzie, które pomaga w lokalizacji i wykonywaniu różnych wersji Pythona. Umożliwia skryptom (lub wierszowi poleceń) wskazanie preferencji dla określonej wersji Pythona oraz zlokalizowanie i wykonanie tej wersji.

To świetne narzędzie, po prostu go używaj!


0

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ę

python C:\Somedir\blah.py

Możesz teraz uruchomić blah.py z dowolnego miejsca, ponieważ nie musisz dodawać rozszerzenia .bat podczas uruchamiania plików bat


python w PATH. I katalog zawierający blah.py również w PATH. Głównym pomysłem jest wykonanie skryptu Pythona bez zapisywania pełnej ścieżki do niego. Ale teraz mam problemy z przekazywaniem argumentów.
ton4eg

3
Ralu, nie potrzebujesz pliku wsadowego, aby wykonać skrypt Pythona w ten sposób. Użyj zmiennej środowiska PATHEXT, aby dołączyć pliki .py i .pyw jako rozszerzenia wykonywalne. To var jest powodem, dla którego nie musisz też określać .bat.
Todd

0

Jeśli to właśnie zrozumiałem, wygląda to tak:

C:\Users\(username)\AppData\Local\Programs\Python\Python(version)

KOPIUJ (nie usuwaj) python.exe i zmień nazwę na py.exe i wykonaj:

py filename.py

0

Po prostu uruchom polecenie:

C:>python .\file_name.py

Zakładając, że nazwa pliku znajduje się w tym samym folderze, a Python został już dodany do zmiennych środowiskowych.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.