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" %*
Python.File
di registri Anda?[HKCU|HKLM]\SOFTWARE\Classes\Applications\python.exe
atau[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.File
ProgId standar . Periksashell\open\command
subkunci 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" %*
.Jawaban:
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).
sumber
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.sumber
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.sumber
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\" %*"
sumber
Agar berfungsi untuk saya, saya harus menggunakan jalur registri:
HKEY_CLASSES_ROOT\py_auto_file\shell\open\command
dan menambahkan
%*
sumber
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" %*
sumber
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
sumber
Asosiasi program Anda untuk
.py
file mungkin kacau. Cukup kaitkan kembali.py
file dengan python Anda yang dapat dieksekusi.Klik kanan
.py
file yang>Open with
>Choose default program ...
> [menemukan C: \ PythonXY \ python.exe]sumber
Saya memeriksa semua kunci registri dengan
python.exe
danpy_auto_file
dan membuatnya mengarah ke instalasi python saya saat ini termasuk th%*
di bagian akhir yang melewati argumen. Mereka cukup sedikit:Tapi itu tidak berhasil untuk saya. Saya juga harus mengubah aplikasi python default saya.
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.
sumber
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 args
di 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" %*
.sumber
Terima kasih banyak atas sebagian besar jawaban lain yang telah membantu saya menemukan solusinya!
Kasus saya adalah membuka
.py
-files denganpy.exe
(tidakpython.exe
secara 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 denganC:\Windows\py.exe
dan dalamC:\Windows\py.ini
konfigurasi saya memiliki beberapa definisi shebanguntuk 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\" %*"
sumber
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
sumber