Windows tidak meneruskan argumen baris perintah ke program Python yang dijalankan dari shell

88

Saya mengalami masalah dalam mendapatkan argumen baris perintah yang diteruskan ke program Python jika saya mencoba menjalankannya secara langsung sebagai perintah yang dapat dieksekusi dari shell perintah Windows. Misalnya, jika saya memiliki program ini (test.py):

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

Dan jalankan:

>test foo
Args: []

jika dibandingkan dengan:

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

Konfigurasi saya memiliki:

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.dll
sumber
Bagaimanapun itu berhasil untuk saya. C: \ Documents and Settings \ Quim> test foo Args: ['foo'] Saya menempatkan test.py di lokasi awal untuk cmd.exe (% HOMEDRIVE %% HOMEPATH% di properti). Untuk selebihnya tidak ada yang istimewa di setup saya: WinXP, ActivePython 2.6.5
joaquin
Bisakah Anda menggunakan RegScanner dan menemukan semua kejadian Python.Filedi registri Anda?
Piotr Dobrogost
2
Wow, bug yang membuat frustrasi :( Saya baru saja menginstal ulang Python dan masih rusak! Bug tersebut dilaporkan di pelacak masalah Python dua tahun lalu bugs.python.org/issue7936 tetapi tidak ada perbaikan - beberapa pengembang menggunakan Windows.
Kolonel Panic
2
Mengalami ini ketika saya menginstal python 3.4 dan mencoba menggunakan python 2.7. Sepertinya pemasang python 3.4 mengacaukannya?
Dogmatixed
Jika sistem menggunakan [HKCU|HKLM]\SOFTWARE\Classes\Applications\python.exeatau [HKCU|HKLM\SOFTWARE\Classes\py_auto_file, maka salah konfigurasi, dan kunci yang melanggar harus dihapus. Kemudian gunakan Explorer ("buka dengan" atau aplikasi pengaturan asosiasi file) untuk memilih entri "Python" yang benar yang menggunakan [HKCU|HKLM]\SOFTWARE\Classes\Python.FileProgId standar . Periksa shell\open\commandsubkunci di regedit. Jika Python 3 diinstal, template perintah harus menggunakan peluncur py. Jika peluncur dipasang untuk semua pengguna, templatnya harus "C:\Windows\py.exe" "%1" %*.
Eryk Sun

Jawaban:

108

Saya pikir saya memecahkan ini. Untuk beberapa alasan ada tempat KEDUA di registri (selain itu ditunjukkan oleh asosiasi file yang disimpan di HKEY_CLASSES_ROOT \ Python.File \ shell \ open \ command):

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

Sepertinya ini adalah pengaturan pengontrol di sistem saya. Pengaturan registri di atas menambahkan "% *" untuk meneruskan semua argumen ke python.exe (itu hilang di registri saya karena alasan tertentu).

mckoss.dll
sumber
8
Kunci saya terletak di sini di Windows 7: HKEY_USERS \ S-1-5-21-2829634124-923609355-2255922086-1001 \ Software \ Classes \ Applications \ python.exe \ shell \ open \ command
Steven Keith
4
Dengan nilai: C: \ Python26 \ python.exe% 1% *
Steven Keith
2
Berhasil untuk saya, ingat bahwa jawaban mckoss adalah lolos atau file .REG jika Anda mengedit nilai secara langsung menghapus
pelolosan
3
Di samping catatan: Akar penyebab ini mungkin karena asosiasi file awal dengan file .py sebelum instalasi Python. Baru saja mengalami masalah ini, file jenis .py telah dikaitkan dengan Notepad dan kemudian Python diinstal dan masalah jelek ini memunculkan kepalanya yang buruk. Di Windows 10 BTW.
g4m3c0d3r
3
Baru-baru ini mengubah peluncur untuk menggunakan C: \ Windows \ py.exe, dan menemukan bug ini. Namun, saya memodifikasi kunci dalam versi @ StevenKeith, dengan "py.exe" menggantikan "python.exe"
Casey Kuball
14

Pengaturan saya berada di bawah kunci registri lain HKEY_CLASSES_ROOT\py_auto_file,. Kunci lain yang disebutkan juga ada, tetapi Windows menggunakan yang ini karena alasan tertentu.

bainorama
sumber
10

Untuk Python 3.3 di Windows 7, pengaturan saya berada di bawah kunci registri lain; kunci yang saya ubah untuk membuat argumen lolos adalah

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

Itu "C:\Python\Python33\python.exe" "%1". Saya hanya menambahkannya %*. Nilai kuncinya sekarang "C:\Python\Python33\python.exe" "%1" %*.

Saya memiliki beberapa (setidaknya lima) kunci lain dengan nilai tersebut "C:\Python\Python33\python.exe" "%1", tetapi ini adalah kunci yang saya ubah yang membuatnya berfungsi.

Cody Piersall
sumber
5

Berikut adalah file .reg untuk diperbaiki untuk Python 3.6, 2.7 dan 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 (ubah nama pengguna)

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
sumber
4

Agar berfungsi untuk saya, saya harus menggunakan jalur registri:

HKEY_CLASSES_ROOT\py_auto_file\shell\open\command

dan menambahkan %*

rundekugel.dll
sumber
1

Jika memperbaiki ini pada sistem Windows 10 saya dengan mengedit kunci registri berikut:

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

untuk nilai ini:

"C:\Python27\python.exe" "%1" %*
stuw
sumber
0

Menarik. Bekerja di sini menggunakan python 2.6 dan 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
sumber
0

Asosiasi program Anda untuk .pyfile mungkin kacau. Cukup kaitkan kembali .pyfile dengan python Anda yang dapat dieksekusi.

Klik kanan .pyfile yang> Open with> Choose default program ...> [menemukan C: \ PythonXY \ python.exe]

congusbongus
sumber
Tidak berfungsi di sistem saya, karena selalu default untuk memanggil Python 3.6. The jawaban yang dipilih melakukan pekerjaan
Aaron3468
Ada masalah sejak Windows10, jadi ini tidak selalu berfungsi.
rundekugel
0

Saya memeriksa semua kunci registri dengan python.exedan py_auto_filedan membuatnya mengarah ke instalasi python saya saat ini termasuk th %*di bagian akhir yang melewati argumen. Mereka cukup sedikit:

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

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

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

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

Tapi itu tidak berhasil untuk saya. Saya juga harus mengubah aplikasi python default saya.

Dialog aplikasi

Seperti yang bisa dilihat, saya menginstal 3 versi Python. Tidak mungkin untuk melihat yang mana di sini jadi saya mencoba ketiganya sebagai aplikasi python default saya. Akhirnya saya bisa mendapatkan argumen skrip saya dengan salah satu dari ketiganya.

MrLeeh
sumber
0

Dengan melihat-lihat registri Windows, saya menemukan semua tempat di mana hal seperti itu Python36\pythonw.exe "%1" %*muncul.

Saat saya mengetik python app.py argsdi command prompt, semuanya bekerja dengan baik.

Ketika saya hanya menggunakan nama aplikasi ( app.py args) Windows membuka app.py dengan Python, tetapi aplikasi gagal ketika mencoba mengakses argv [1], karena len (argv) adalah 1.

Rupanya Windows cukup tahu untuk meneruskan file py ke Python, tetapi saya tidak tahu dari melihat entri registri bagaimana membangun perintah. Tampaknya menggunakan "%1"daripada "%1" %*.

Richard Mateosian
sumber
0

Terima kasih banyak atas sebagian besar jawaban lain yang telah membantu saya menemukan solusinya!

Kasus saya adalah membuka .py-files dengan py.exe(tidak python.exesecara langsung), kasus ini dicatat dalam beberapa komentar, tetapi saya memutuskan untuk memposting ini sebagai jawaban terpisah untuk menekankan perbedaannya.

Jadi saya memiliki .py-files saya terkait dengan C:\Windows\py.exedan dalam C:\Windows\py.inikonfigurasi saya memiliki beberapa definisi 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

untuk digunakan dalam skrip saya seperti ini #!<MY_VENV_PY>.

Dan pada Microsoft Windows 7 [Versi 6.1.7601] skrip python saya TIDAK menerima argumen seperti ini

script.py 1 2

tapi ini bekerja dengan baik

py script.py 1 2

Asosiasi file baik-baik saja

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

Saya sudah mencoba banyak perubahan registri, tetapi bantuan terakhir adalah perubahan berikut (disimpan ke .reg-file and run). Saya telah menemukan "%1"string pencarian kunci registri ini dengan nilai awal "C:\Windows\py.exe" "%1"dan ditambahkan %*pada akhirnya sebagai catatan jawaban lain:

Windows Registry Editor Version 5.00

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

Untuk informasi, sebelum saya mencoba mengatur kunci dan nilai ini dan tidak membantu (setidaknya sebelum yang disebutkan di atas):

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
sumber
0

Harus memodifikasi ini di Windows 10 agar berfungsi (% * pada akhirnya)

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

Arunex
sumber