Windows ไม่ส่งอาร์กิวเมนต์บรรทัดคำสั่งไปยังโปรแกรม Python ที่เรียกใช้งานจากเชลล์


88

ฉันมีปัญหาในการส่งอาร์กิวเมนต์บรรทัดคำสั่งไปยังโปรแกรม Python หากฉันพยายามเรียกใช้โดยตรงเป็นคำสั่งที่เรียกใช้งานได้จากเชลล์คำสั่งของ Windows ตัวอย่างเช่นถ้าฉันมีโปรแกรมนี้ (test.py):

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

และดำเนินการ:

>test foo
Args: []

เมื่อเทียบกับ:

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

การกำหนดค่าของฉันมี:

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

อย่างไรก็ตามมันได้ผลสำหรับฉัน C: \ Documents and Settings \ Quim> test foo Args: ['foo'] ฉันตั้ง test.py ในตำแหน่งเริ่มต้นสำหรับ cmd.exe (% HOMEDRIVE %% HOMEPATH% ในคุณสมบัติ) สำหรับส่วนที่เหลือไม่มีอะไรพิเศษในการตั้งค่าของฉัน: winxp, Activepython 2.6.5
joaquin

คุณช่วยใช้RegScannerและค้นหาเหตุการณ์ทั้งหมดPython.Fileในรีจิสทรีของคุณได้ไหม
Piotr Dobrogost

2
ว้าวช่างเป็นข้อผิดพลาดที่น่าผิดหวัง :( ฉันเพิ่งติดตั้ง Python ใหม่และมันก็ยังใช้งานไม่ได้! มีรายงานข้อผิดพลาดที่ตัวติดตามปัญหา Python เมื่อสองปีก่อนbugs.python.org/issue7936แต่ไม่มีการแก้ไข - มีนักพัฒนาเพียงไม่กี่คนที่ใช้ Windows
พันเอก Panic

2
พบสิ่งนี้เมื่อฉันติดตั้ง python 3.4 และพยายามใช้ python 2.7 ดูเหมือนว่าโปรแกรมติดตั้ง python 3.4 จะทำให้มันยุ่งเหยิง?
Dogmatixed

หากระบบกำลังใช้[HKCU|HKLM]\SOFTWARE\Classes\Applications\python.exeหรือ[HKCU|HKLM\SOFTWARE\Classes\py_auto_fileกำหนดค่าไม่ถูกต้องและควรลบคีย์ที่กระทำผิด จากนั้นใช้ Explorer ("เปิดด้วย" หรือแอปการตั้งค่าการเชื่อมโยงไฟล์) เพื่อเลือกรายการ "Python" ที่ถูกต้องซึ่งใช้[HKCU|HKLM]\SOFTWARE\Classes\Python.FileProgId มาตรฐาน ตรวจสอบshell\open\commandคีย์ย่อยใน regedit หากติดตั้ง Python 3 เทมเพลตคำสั่งควรใช้ py launcher "C:\Windows\py.exe" "%1" %*หากปล่อยมีการติดตั้งสำหรับผู้ใช้ทั้งหมดแม่แบบที่ควรจะเป็น
Eryk Sun

คำตอบ:


108

ฉันคิดว่าฉันแก้ปัญหานี้ได้ ด้วยเหตุผลบางประการจึงมีตำแหน่งที่สองในรีจิสทรี (นอกเหนือจากที่แสดงโดยการเชื่อมโยงไฟล์ที่เก็บไว้ใน HKEY_CLASSES_ROOT \ Python.File \ shell \ open \ command):

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

ดูเหมือนว่าจะเป็นการตั้งค่าการควบคุมในระบบของฉัน การตั้งค่ารีจิสทรีด้านบนจะเพิ่ม "% *" เพื่อส่งผ่านอาร์กิวเมนต์ทั้งหมดไปยัง python.exe (ไม่มีในรีจิสทรีของฉันด้วยเหตุผลบางประการ)


8
คีย์ของฉันอยู่ที่นี่ใน Windows 7: HKEY_USERS \ S-1-5-21-2829634124-923609355-2255922086-1001 \ Software \ Classes \ Applications \ python.exe \ shell \ open \ command
Steven Keith

4
ด้วยค่า: C: \ Python26 \ python.exe% 1% *
Steven Keith

2
ทำงานให้ฉันโปรดจำไว้ว่าคำตอบของ mckoss คือ Escape หรือไฟล์. REG หากคุณกำลังแก้ไขค่าจะลบ
Escape

3
หมายเหตุด้านข้าง: สาเหตุหลักของปัญหานี้อาจเกิดจากการเชื่อมโยงไฟล์เริ่มต้นกับไฟล์. py ก่อนการติดตั้ง Python เพิ่งพบปัญหานี้ไฟล์ประเภท. py เชื่อมโยงกับ Notepad จากนั้นจึงติดตั้ง Python และปัญหาที่น่าเกลียดนี้ทำให้หัวของมันน่าเกลียด บน Windows 10 BTW.
g4m3c0d3r

3
เพิ่งเปลี่ยนตัวเรียกใช้งานเพื่อใช้ C: \ Windows \ py.exe และพบข้อบกพร่องนี้ อย่างไรก็ตามฉันได้แก้ไขคีย์ในเวอร์ชันของ @ StevenKeith โดยใช้ "py.exe" แทน "python.exe"
Casey Kuball

14

HKEY_CLASSES_ROOT\py_auto_fileการตั้งค่าของฉันอยู่ภายใต้การยังคีย์รีจิสทรีอื่น คีย์อื่น ๆ ที่กล่าวถึงก็มีอยู่เช่นกัน แต่ Windows ใช้คีย์นี้ด้วยเหตุผลบางประการ


10

สำหรับ Python 3.3 บน Windows 7 การตั้งค่าของฉันอยู่ภายใต้คีย์รีจิสทรีอื่น กุญแจสำคัญที่ฉันเปลี่ยนเพื่อทำให้อาร์กิวเมนต์ถูกส่งผ่านคือ

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

"C:\Python\Python33\python.exe" "%1"มันเป็น ฉันเพียงผนวก%*กับมัน "C:\Python\Python33\python.exe" "%1" %*ค่าคีย์ที่อยู่ในขณะนี้

ฉันมีคีย์อื่น ๆ หลายอัน (อย่างน้อยห้า) ที่มีค่า"C:\Python\Python33\python.exe" "%1"แต่นี่คือคีย์ที่ฉันเปลี่ยนที่ทำให้มันใช้งานได้


5

นี่คือไฟล์. reg ที่จะแก้ไขสำหรับ Python 3.6, 2.7 และ 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 (เปลี่ยนชื่อผู้ใช้)

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

เพื่อให้มันใช้งานได้ฉันต้องใช้เส้นทางรีจิสทรี:

HKEY_CLASSES_ROOT\py_auto_file\shell\open\command

และเพิ่มไฟล์ %*


1

หากแก้ไขสิ่งนี้ในระบบ Windows 10 ของฉันโดยแก้ไขรีจิสตรีคีย์ต่อไปนี้:

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

ถึงค่านี้:

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

0

น่าสนใจ. ทำงานที่นี่โดยใช้ python 2.6 และ 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

การเชื่อมโยงโปรแกรมของคุณสำหรับ.pyไฟล์อาจยุ่งเหยิง เพียงเชื่อมโยง.pyไฟล์อีกครั้งกับไฟล์ปฏิบัติการ python ของคุณ

คลิกขวา.pyไฟล์> Open with> Choose default program ...> [พบ C: \ PythonXY \ python.exe]


ไม่ทำงานในระบบของฉันเนื่องจากเป็นค่าเริ่มต้นในการเรียก Python 3.6 คำตอบที่เลือกได้ทำงาน
Aaron3468

มีปัญหาตั้งแต่ Windows10 ดังนั้นจึงไม่สามารถใช้งานได้เสมอไป
rundekugel

0

ฉันตรวจสอบคีย์รีจิสตรีทั้งหมดด้วยpython.exeและpy_auto_fileทำให้มันชี้ไปที่การติดตั้ง python ปัจจุบันของฉันรวมถึง th %*ในตอนท้ายที่ส่งผ่านอาร์กิวเมนต์ พวกเขาค่อนข้างน้อย:

  • HKEY_CLASSES_ROOT \ Applications \ python.exe \ shell \ open \ คำสั่ง:

    • องค์กร: "C: \ miniconda3 \ python.exe" "% 1" "% *"
    • เปลี่ยนแปลง: "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"
    • เปลี่ยนแปลง: "C: \ Python35 \ python.exe" "% 1" "% *"
  • HKEY_CURRENT_USER \ Software \ Classes \ py_auto_file \ shell \ open \ command

    • องค์กร: "C: \ Python35 \ python.exe" "% 1" "% *"
  • HKEY_USERS \ S-1-5-21-2621213409-1291422344-4183577876-2165 \ Software \ Classes \ py_auto_file \ shell \ open \ command

    • องค์กร: "C: \ Python35 \ python.exe" "% 1" "% *"
  • HKEY_USERS \ S-1-5-21-2621213409-1291422344-4183577876-2165_Classes \ py_auto_file \ shell \ open \ command

    • องค์กร: "C: \ Python35 \ python.exe" "% 1" "% *"
  • HKEY_CLASSES_ROOT \ Applications \ pythonw.exe \ shell \ open \ command

    • องค์กร: "C: \ Python34 \ pythonw.exe" "% 1"
    • เปลี่ยนแปลง: "C: \ Python35 \ pythonw.exe" "% 1" "% *"
  • HKEY_CURRENT_USER \ Software \ Classes \ Applications \ python.exe \ shell \ open \ command

    • องค์กร: "C: \ Python35 \ python.exe" "% 1" "% *"

แต่นั่นไม่ได้ผลสำหรับฉัน ฉันต้องเปลี่ยนแอปพลิเคชัน python เริ่มต้นด้วย

กล่องโต้ตอบแอปพลิเคชัน

อย่างที่เห็นฉันติดตั้ง Python 3 เวอร์ชัน เป็นไปไม่ได้ที่จะเห็นว่าอันไหนอยู่ที่นี่ดังนั้นฉันจึงลองทั้งสามตัวเป็นแอปพลิเคชัน python เริ่มต้นของฉัน ในที่สุดฉันก็สามารถหาข้อโต้แย้งสคริปต์ของฉันกับหนึ่งในสามข้อนี้ได้


0

จากการดูรีจิสทรีของ Windows ฉันพบทุกที่ที่มีสิ่งที่ต้องการ Python36\pythonw.exe "%1" %*ปรากฏขึ้น

เมื่อฉันพิมพ์python app.py argsที่พรอมต์คำสั่งทุกอย่างทำงานได้อย่างถูกต้อง

เมื่อฉันใช้เพียงชื่อแอป ( app.py args) Windows จะเปิด app.py ใน Python แต่แอปล้มเหลวเมื่อพยายามเข้าถึง argv [1] เนื่องจาก len (argv) คือ 1

เห็นได้ชัดว่า Windows รู้ดีพอที่จะส่งไฟล์ py ไปยัง Python แต่ฉันไม่สามารถเข้าใจได้ว่าจะดูรายการรีจิสตรีว่ามันสร้างคำสั่งอย่างไร แต่ดูเหมือนว่ามันจะใช้มากกว่า"%1""%1" %*


0

ขอบคุณมากสำหรับคำตอบอื่น ๆ ที่ช่วยฉันหาวิธีแก้ปัญหา!

กรณีของฉันคือการเปิด - .pyไฟล์ที่มีpy.exe(ไม่ใช่python.exeโดยตรง) กรณีนี้ระบุไว้ในสองความคิดเห็น แต่ฉันตัดสินใจโพสต์สิ่งนี้เป็นคำตอบแยกต่างหากเพื่อเน้นความแตกต่าง

ดังนั้นฉันจึงมี.py-files ของฉันที่เกี่ยวข้องC:\Windows\py.exeและในC:\Windows\py.iniconfig ฉันมีคำจำกัดความของ 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

#!<MY_VENV_PY>ที่จะใช้ในสคริปต์ของฉันเช่นนี้

และบน Microsoft Windows 7 [เวอร์ชัน 6.1.7601] สคริปต์ python ของฉันไม่ได้รับ args เช่นนี้

script.py 1 2

แต่มันก็ใช้ได้ดี

py script.py 1 2

การเชื่อมโยงไฟล์ทำได้ดี

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

ฉันได้ลองเปลี่ยนรีจิสทรีหลายครั้งแล้ว แต่การช่วยเหลือครั้งสุดท้ายคือการเปลี่ยนแปลงต่อไปนี้ (บันทึกลงใน.regไฟล์และเรียกใช้) ฉันพบ"%1"สตริงการค้นหาคีย์รีจิสทรีนี้พร้อมค่าเริ่มต้น"C:\Windows\py.exe" "%1"และเพิ่ม%*ในตอนท้ายเป็นคำตอบอื่น ๆ หมายเหตุ:

Windows Registry Editor Version 5.00

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

สำหรับข้อมูลก่อนที่ฉันจะพยายามตั้งค่าคีย์และค่าเหล่านี้ แต่ไม่ได้ช่วยอะไร (อย่างน้อยก่อนที่จะระบุไว้ข้างต้น):

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

ต้องแก้ไขสิ่งนี้ใน Windows 10 เพื่อให้ใช้งานได้ (% * ในตอนท้าย)

คอมพิวเตอร์ \ HKEY_USERS \ S-1-5-21-2364940108-955964078-1358188674-1001 \ Software \ Classes \ Applications \ py.exe \ shell \ open \ command

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.