Windows, komut satırı argümanlarını kabuktan çalıştırılan Python programlarına iletmiyor


88

Bir Windows komut kabuğundan doğrudan çalıştırılabilir komutlar olarak çalıştırmaya çalışırsam, Python programlarına aktarılan komut satırı argümanlarını almakta sorun yaşıyorum. Örneğin, bu programa sahipsem (test.py):

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

Ve yürütün:

>test foo
Args: []

ile kıyaslandığında:

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

Yapılandırmam şunları içeriyor:

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

Ancak benim için çalışıyor. C: \ Documents and Settings \ Quim> test foo Args: ['foo'] cmd.exe için test.py'yi başlangıç ​​konumuna yerleştirdim (özelliklerde% HOMEDRIVE %% HOMEPATH%). Geri kalanı için kurulumumda özel bir şey yok: winxp, Activepython 2.6.5
joaquin

Lütfen RegScanner'ı kullanarak tüm tekrarlarını Python.Filekayıt defterinizde bulur musunuz?
Piotr Dobrogost

2
Vay canına, ne sinir bozucu bir hata :( Python'u yeni yeniden yükledim ve hala bozuk! Hata iki yıl önce Python sorun izleyicisinde bildirildi bugs.python.org/issue7936 ancak düzeltme yok - geliştiricilerin birkaçı Windows kullanıyor.
Albay Panic

2
Python 3.4'ü kurduğumda ve python 2.7'yi kullanmaya çalıştığımda bununla karşılaştım. Python 3.4 yükleyicisi her şeyi mahvetmiş gibi görünüyor?
Dogmatixed

Sistem [HKCU|HKLM]\SOFTWARE\Classes\Applications\python.exeveya kullanıyorsa [HKCU|HKLM\SOFTWARE\Classes\py_auto_file, yanlış yapılandırılmıştır ve sorunlu anahtarlar silinmelidir. Ardından, standart [HKCU|HKLM]\SOFTWARE\Classes\Python.FileProgId'yi kullanan doğru "Python" girişini seçmek için Explorer'ı ("birlikte aç" veya dosya ilişkilendirme ayarları uygulaması) kullanın . shell\open\commandRegedit'te alt anahtarı kontrol edin . Python 3 kuruluysa, komut şablonu py başlatıcıyı kullanmalıdır. Başlatıcı tüm kullanıcılar için kuruluysa, şablon olmalıdır "C:\Windows\py.exe" "%1" %*.
Eryk Sun

Yanıtlar:


108

Sanırım bunu çözdüm. Bazı nedenlerden dolayı kayıt defterinde İKİNCİ bir yer vardır (HKEY_CLASSES_ROOT \ Python.File \ shell \ open \ command konumunda depolanan dosya ilişkilendirmelerinin gösterdiği yerin yanı sıra):

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

Bu, sistemimdeki kontrol edici ayar gibi görünüyor. Yukarıdaki kayıt defteri ayarı, tüm bağımsız değişkenleri python.exe'ye geçirmek için "% *" ekler (bazı nedenlerden dolayı kayıt defterimde eksikti).


8
Anahtarım Windows 7'de burada bulunuyor: HKEY_USERS \ S-1-5-21-2829634124-923609355-2255922086-1001 \ Software \ Classes \ Applications \ python.exe \ shell \ open \ command
Steven Keith

4
Şu değerle: C: \ Python26 \ python.exe% 1% *
Steven Keith

2
Benim için çalıştı, mckoss'un cevabının kaçtığını veya değerleri düzenliyorsanız bir .REG dosyası olduğunu unutmayın, oradaki kaçışları doğrudan kaldırır
fedmich

3
Bir yan not: Bunun temel nedeni, Python yüklemesinden önce .py dosyalarıyla yapılan ilk dosya ilişkilendirmesinden kaynaklanıyor olabilir. Bu sorunla karşılaştım, .py türündeki dosyalar Not Defteri ile ilişkilendirildi ve ardından Python yüklendi ve bu çirkin sorun çirkin başını kaldırdı. Windows 10 BTW'de.
g4m3c0d3r

3
Son zamanlarda başlatıcıyı C: \ Windows \ py.exe kullanacak şekilde değiştirdi ve bu hatayla karşılaştı. Ancak, @ StevenKeith'in sürümündeki anahtarı, "python.exe" yerine "py.exe" ile değiştirdim
Casey Kuball

14

Ayarım başka bir kayıt defteri anahtarının altındaydı HKEY_CLASSES_ROOT\py_auto_file. Bahsedilen diğer anahtarlar da vardı, ancak Windows bunu bir nedenle kullanıyordu.


10

Windows 7'de Python 3.3 için, ayarım başka bir kayıt anahtarının altındaydı; argümanların geçmesi için değiştirdiğim anahtar

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

Öyleydi "C:\Python\Python33\python.exe" "%1". Ben sadece %*ona ekledim . Anahtarın değeri artık "C:\Python\Python33\python.exe" "%1" %*.

Değere sahip birkaç (en az beş) başka anahtarım vardı "C:\Python\Python33\python.exe" "%1", ancak bu, çalışmasını sağlayan değiştirdiğim anahtar .


5

Python 3.6, 2.7 ve Anaconda3 için düzeltilecek .reg dosyaları şunlardır:

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 (kullanıcı adını değiştir)

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

Benim için çalışmasını sağlamak için kayıt defteri yolunu kullanmam gerekiyordu:

HKEY_CLASSES_ROOT\py_auto_file\shell\open\command

ve bir %*


1

Bunu Windows 10 sistemimde aşağıdaki kayıt defteri anahtarlarını düzenleyerek düzelttiyseniz:

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

bu değere:

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

0

İlginç. Python 2.6 ve Windows XP (5.1.2600) kullanılarak burada çalışır:

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

.pyDosyalar için program ilişkilendirmeleriniz karışmış olabilir. .pyDosyaları python çalıştırılabilir dosyanızla yeniden ilişkilendirmeniz yeterlidir.

Sağ tıklayıp .pydosyayı> Open with> Choose default program ...> [C bulun: \ PythonXY \ python.exe]


Her zaman Python 3.6 varsayılan olarak ayarlandığından, sistemimde çalışmadı. Seçilen cevap çalışma yaptı
Aaron3468

Windows10'dan beri sorunlar var, bu yüzden bu her zaman çalışmıyor.
rundekugel

0

Ben tüm kayıt defteri anahtarlarını kontrol python.exeve py_auto_fileve onları inci dahil benim şimdiki piton yüklemesine işaret yapılan %*argümanları geçer sonunda. Oldukça azdılar:

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

    • org: "C: \ miniconda3 \ python.exe" "% 1" "% *"
    • değiştirildi: "C: \ Python35 \ python.exe" "% 1" "% *"
  • HKEY_CLASSES_ROOT \ py_auto_file \ shell \ open \ command

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

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

Ama bu benim için işi yapmadı. Varsayılan python uygulamamı da değiştirmek zorunda kaldım.

Uygulama iletişim kutusu

Görüldüğü gibi kurulu 3 Python sürümüm var. Hangisinin burada olduğunu görmek imkansız, bu yüzden üçünü de varsayılan python uygulamam olarak denedim. Sonunda senaryo argümanlarımı bu üçünden biriyle alabildim.


0

Windows kayıt defterine bakarak, benzer herhangi bir şeyin Python36\pythonw.exe "%1" %*göründüğü tüm yerleri buldum .

Yazdığımda python app.py argsKomut istemine her şey düzgün çalışıyor.

Yalnızca uygulama adını kullandığımda (app.py args ) kullandığımda, Windows Python'da app.py'yi açar, ancak uygulama argv [1] 'e erişmeye çalıştığında başarısız olur, çünkü len (argv) 1'dir.

Görünüşe göre Windows bir py dosyasını Python'a geçirecek kadar biliyor, ancak kayıt defteri girişlerine bakarak komutu nasıl oluşturduğunu anlayamıyorum. Bu kullandığı görülüyor "%1"ziyade "%1" %*.


0

Çözümü bulmama yardımcı olduğunuz için diğer yanıtların çoğu için çok teşekkürler!

Benim .pydurumum -files py.exe(değilpython.exe doğrudan ) , bu durum birkaç yorumda belirtildi, ancak farkı vurgulamak için bunu ayrı bir cevap olarak göndermeye karar verdim.

Bu yüzden, .py-filesim ile ilişkili C:\Windows\py.exeve config'de C:\Windows\py.inibirkaç shebang tanımım var

[commands]
<my_venv_py> = C:\Programs\my_venv_py\Scripts\python.exe
<my_venv_py_w> = C:\Programs\my_venv_py\Scripts\pythonw.exe

komut dosyalarımda bunun gibi kullanmak #!<MY_VENV_PY>.

Ve Microsoft Windows 7 [Sürüm 6.1.7601] benim python komut dosyası ETMEDİ böyle args alınan

script.py 1 2

ama bu iyi çalıştı

py script.py 1 2

Dosya ilişkilendirmeleri iyiydi

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

Kayıt defteri değişikliklerinin çoğunu denedim, ancak son yardım aşağıdaki değişiklikti (bir .regdosyaya kaydedildi ve çalıştırıldı). Bu kayıt defteri anahtarını arama "%1"dizesini başlangıç ​​değeriyle buldum"C:\Windows\py.exe" "%1"%* ve sonunda diğer yanıtların notu olarak ekledim :

Windows Registry Editor Version 5.00

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

Bilgi için, bu anahtarları ve değerleri kurmaya çalışmadan önce ve yardımcı olmadım (en azından yukarıda belirtilenlerden önce):

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

Çalışması için bunu Windows 10'da değiştirmek zorunda kaldım (sonunda% *)

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.