Windows non passa gli argomenti della riga di comando ai programmi Python eseguiti dalla shell


88

Ho problemi a far passare gli argomenti della riga di comando ai programmi Python se provo a eseguirli direttamente come comandi eseguibili da una shell dei comandi di Windows. Ad esempio, se ho questo programma (test.py):

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

Ed esegui:

>test foo
Args: []

paragonato a:

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

La mia configurazione ha:

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

Comunque funziona per me. C: \ Documents and Settings \ Quim> test foo Args: ['foo'] Ho posizionato test.py nella posizione iniziale di cmd.exe (% HOMEDRIVE %% HOMEPATH% nelle proprietà). Per il resto non c'è niente di speciale nel mio setup: winxp, Activepython 2.6.5
joaquin

Potresti usare RegScanner e trovare tutte le occorrenze di Python.Filenel tuo registro?
Piotr Dobrogost

2
Wow, che bug frustrante :( Ho appena reinstallato Python ed è ancora rotto! Il bug è stato segnalato al tracker dei problemi di Python due anni fa bugs.python.org/issue7936 ma non c'è soluzione - pochi sviluppatori usano Windows.
Colonel Panic

2
Mi sono imbattuto in questo quando ho installato python 3.4 e ho provato a usare python 2.7. Sembra che il programma di installazione di Python 3.4 abbia incasinato tutto?
Dogmatixed

Se il sistema utilizza [HKCU|HKLM]\SOFTWARE\Classes\Applications\python.exeo [HKCU|HKLM\SOFTWARE\Classes\py_auto_file, è configurato in modo errato e le chiavi offensive devono essere eliminate. Quindi utilizzare Explorer ("apri con" o l'app per le impostazioni dell'associazione file) per selezionare la voce "Python" corretta che utilizza il [HKCU|HKLM]\SOFTWARE\Classes\Python.FileProgId standard . Controlla la shell\open\commandsottochiave in regedit. Se è installato Python 3, il modello di comando dovrebbe utilizzare il programma di avvio py. Se il programma di avvio è installato per tutti gli utenti, il modello dovrebbe essere "C:\Windows\py.exe" "%1" %*.
Eryk Sun,

Risposte:


108

Penso di aver risolto questo problema. Per qualche motivo c'è un SECONDO posto nel registro (oltre a quello mostrato dalle associazioni di file memorizzate in HKEY_CLASSES_ROOT \ Python.File \ shell \ open \ command):

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

Questa sembra essere l'impostazione di controllo sul mio sistema. L'impostazione del registro di cui sopra aggiunge "% *" per passare tutti gli argomenti a python.exe (mancava nel mio registro per qualche motivo).


8
La mia chiave si trova qui su Windows 7: HKEY_USERS \ S-1-5-21-2829634124-923609355-2255922086-1001 \ Software \ Classes \ Applications \ python.exe \ shell \ open \ command
Steven Keith

4
Con il valore: C: \ Python26 \ python.exe% 1% *
Steven Keith

2
Ha funzionato per me, ricorda che la risposta di mckoss è in escape o un file .REG se stai modificando i valori rimuove direttamente gli
escape

3
Nota a margine: la causa principale di ciò potrebbe essere dovuta a un'associazione di file iniziale con file .py prima dell'installazione di Python. Ho appena riscontrato questo problema, file di tipo .py erano stati associati a Blocco note e quindi è stato installato Python e questo brutto problema ha sollevato la sua brutta testa. Su Windows 10 BTW.
g4m3c0d3r

3
Recentemente ha cambiato il programma di avvio per utilizzare C: \ Windows \ py.exe e si è imbattuto in questo bug. Tuttavia, ho modificato la chiave nella versione di @ StevenKeith, con "py.exe" sostituito da "python.exe"
Casey Kuball,

14

La mia impostazione era sotto un'altra chiave di registro, HKEY_CLASSES_ROOT\py_auto_file. Esistevano anche le altre chiavi menzionate, ma Windows utilizzava questa per qualche motivo.


10

Per Python 3.3 su Windows 7, la mia impostazione era sotto un'altra chiave di registro; la chiave che ho cambiato per far passare gli argomenti è stata

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

Lo è stato "C:\Python\Python33\python.exe" "%1". L'ho solo aggiunto %*. Il valore della chiave è adesso "C:\Python\Python33\python.exe" "%1" %*.

Avevo diverse (almeno cinque) altre chiavi con il valore "C:\Python\Python33\python.exe" "%1", ma questa è quella che ho cambiato per farlo funzionare.


5

Ecco i file .reg da correggere per Python 3.6, 2.7 e 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 (cambia nome utente)

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

Per farlo funzionare per me, ho dovuto utilizzare il percorso del registro:

HKEY_CLASSES_ROOT\py_auto_file\shell\open\command

e ha aggiunto un file %*


1

Se il problema è stato risolto sul mio sistema Windows 10, modificando le seguenti chiavi di registro:

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

a questo valore:

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

0

Interessante. Funziona qui usando Python 2.6 e 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

Le associazioni del programma per i .pyfile potrebbero essere incasinate. Basta riassociare i .pyfile con il tuo eseguibile Python.

Tasto destro del mouse un .pyfile> Open with> Choose default program ...> [trova C: \ PythonXY \ python.exe]


Non ha funzionato sul mio sistema, poiché per impostazione predefinita è sempre stato chiamato Python 3.6. La risposta selezionata ha funzionato
Aaron3468

Ci sono problemi da Windows10, quindi questo non funziona sempre.
rundekugel

0

Ho controllato tutte le chiavi di registro con python.exee py_auto_filee le ho fatte puntare alla mia attuale installazione di Python, inclusa la th %*alla fine che passa gli argomenti. Erano parecchi:

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

    • org: "C: \ miniconda3 \ python.exe" "% 1" "% *"
    • modificato: "C: \ Python35 \ python.exe" "% 1" "% *"
  • HKEY_CLASSES_ROOT \ py_auto_file \ shell \ open \ command

    • org: "C: \ Programmi \ Sublime Text 3 \ sublime_text.exe" "% 1"
    • modificato: "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"
    • modificato: "C: \ Python35 \ pythonw.exe" "% 1" "% *"
  • HKEY_CURRENT_USER \ Software \ Classes \ Applications \ python.exe \ shell \ open \ command

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

Ma questo non ha funzionato per me. Ho dovuto cambiare anche la mia applicazione Python predefinita.

Finestra di dialogo dell'applicazione

Come si può vedere ho installato 3 versioni di Python. È impossibile vedere quale è quale qui, quindi ho provato tutti e tre come applicazione Python predefinita. Alla fine sono stato in grado di ottenere i miei argomenti sul copione con uno di questi tre.


0

Esaminando il registro di Windows, ho trovato tutti i posti in cui Python36\pythonw.exe "%1" %*appare qualcosa di simile .

Quando digito python app.py argsal prompt dei comandi, tutto funziona correttamente.

Quando uso solo il nome dell'app ( app.py args), Windows apre app.py in Python, ma l'app non riesce quando tenta di accedere a argv [1], perché len (argv) è 1.

Apparentemente Windows ne sa abbastanza per passare un file py a Python, ma non riesco a capire guardando le voci di registro come costruisce il comando. Sembra che stia usando "%1"piuttosto che "%1" %*.


0

Mille grazie per la maggior parte delle altre risposte per avermi aiutato a trovare la soluzione!

Il mio caso era quello di aprire .py-file con py.exe(non python.exedirettamente), questo caso è stato notato in un paio di commenti, ma ho deciso di postare questo come risposta separata per sottolineare la differenza.

Quindi ho i miei file .pyassociati C:\Windows\py.exee in C:\Windows\py.iniconfig ho un paio di definizioni 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

da usare nei miei script come questo #!<MY_VENV_PY>.

E su Microsoft Windows 7 [Versione 6.1.7601] il mio script Python NON ha ricevuto argomenti come questo

script.py 1 2

ma questo ha funzionato bene

py script.py 1 2

Le associazioni di file erano OK

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

Ho provato molte modifiche al registro, ma l'ultima modifica è stata la seguente modifica (salvata in un .regfile ed eseguita). Ho trovato questa chiave di registro di ricerca "%1"stringa con il valore iniziale "C:\Windows\py.exe" "%1"e aggiunta %*alla fine come nota di altre risposte:

Windows Registry Editor Version 5.00

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

Per informazioni, prima ho provato a impostare queste chiavi e valori e non ho aiutato (almeno prima di quanto indicato sopra):

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

Ho dovuto modificarlo in Windows 10 per farlo funzionare (% * alla fine)

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.