Pertanyaan Windows tidak mengirimkan argumen baris perintah ke program Python yang dieksekusi dari shell


Saya mengalami kesulitan untuk mendapatkan argumen baris perintah yang diteruskan ke program Python jika saya mencoba menjalankannya secara langsung sebagai perintah yang dapat dijalankan dari shell perintah Windows. Sebagai contoh, 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" %*

75
2018-04-14 20:56


asal


Jawaban:


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

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

Ini tampaknya menjadi pengaturan pengontrol pada sistem saya. Pengaturan registri di atas menambahkan "% *" untuk meneruskan semua argumen ke python.exe (itu hilang dalam registri saya karena alasan tertentu).


85
2018-04-14 21:28



Pengaturan saya masih di bawah kunci registri lain, HKEY_CLASSES_ROOT\py_auto_file. Kunci lain yang disebutkan juga ada, tetapi Windows menggunakan yang ini untuk beberapa alasan.


13
2017-10-14 18:57



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

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

Dulu "C:\Python\Python33\python.exe" "%1". Saya hanya menambahkan %* untuk itu. Nilai kuncinya adalah sekarang "C:\Python\Python33\python.exe" "%1" %*.

Saya memiliki beberapa (setidaknya lima) kunci lain dengan nilainya "C:\Python\Python33\python.exe" "%1", tapi ini yang saya ubah yang membuatnya bekerja.


8
2018-04-13 22:32



Untuk membuatnya bekerja untuk saya, saya harus menggunakan jalur registri:

HKEY_CLASSES_ROOT\py_auto_file\shell\open\command

dan menambahkan a %*


2
2018-03-15 16:36



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

1
2018-04-14 21:15



Berikut adalah file .reg yang 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\" %*"

1
2018-06-02 13:09



Asosiasi program Anda untuk .py file mungkin kacau. Hanya mengaitkan kembali .py file dengan python Anda dieksekusi.

Klik kanan a .py file> Open with > Choose default program ... > [temukan C: \ PythonXY \ python.exe]


0
2017-07-15 06:12



Saya memeriksa semua kunci registri dengan python.exe dan py_auto_file dan membuat mereka menunjuk ke instalasi python saya saat ini termasuk th %* pada akhirnya yang melewati argumen. Mereka cukup banyak:

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

    • org: "C: \ miniconda3 \ python.exe" "% 1" "% *"
    • berubah: "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"
    • berubah: "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" "% *"
  • Perintah HKEY_CLASSES_ROOT \ Applications \ pythonw.exe \ shell \ open \

    • org: "C: \ Python34 \ pythonw.exe" "% 1"
    • berubah: "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 untukku. Saya harus mengubah aplikasi python default saya juga.

Application dialog

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


0
2017-12-16 12:38