วิธีเรียกใช้สคริปต์ Python ใน Windows


92

ฉันมีสคริปต์ง่ายๆ blah.py (โดยใช้ Python 2):

import sys
print sys.argv[1]

หากฉันรันสคริปต์ของฉันโดย:

python c:/..../blah.py argument

มันพิมพ์อาร์กิวเมนต์ แต่ถ้าฉันรันสคริปต์โดย:

blah.py argument

เกิดข้อผิดพลาด:

IndexError ...

ข้อโต้แย้งจึงไม่ส่งผ่านไปยังสคริปต์

python.exe ใน PATH โฟลเดอร์ที่มี blah.py อยู่ใน PATH ด้วย
python.exe เป็นโปรแกรมเริ่มต้นในการเรียกใช้ไฟล์ * .py

อะไรคือปัญหา?


3
การโพสต์ข้อมูลโค้ดอาจช่วยให้เราช่วยคุณได้
jldupont

ผู้ชายที่ไม่มีลูกบอลคริสตัลได้ให้วิธีแก้ปัญหาแล้ว =) พิมพ์ sys.argv [1] สร้างข้อผิดพลาดนี้
ton4eg

หากคุณติดตั้ง Python ไว้หลายเวอร์ชันคุณอาจต้องใช้stackoverflow.com/questions/1934675/…นี้
laike9m

บอกให้ python เรียกใช้สคริปต์ของฉันด้วยตนเองจากรีจิสทรี: "C: \ Python27 \ python.exe" "C: \ Python27 \ tpt.py" "% 1" `

คำตอบ:


144

เมื่อคุณรันสคริปต์โดยไม่ต้องพิมพ์ "python" ข้างหน้าคุณจำเป็นต้องรู้สองสิ่งเกี่ยวกับวิธีที่ Windows เรียกใช้โปรแกรม อันดับแรกคือค้นหาว่า Windows คิดว่าเป็นไฟล์ประเภทใด:

    C: \> Assoc .py
    .py = Python.File

ถัดไปคุณต้องรู้ว่า Windows ดำเนินการกับส่วนขยายนั้นอย่างไร มันเกี่ยวข้องกับไฟล์ประเภท "Python.File" ดังนั้นคำสั่งนี้จะแสดงให้เห็นว่ามันจะทำอะไร:

    C: \> ftype Python.File
    Python.File = "c: \ python26 \ python.exe" "% 1"% *

ดังนั้นในเครื่องของฉันเมื่อฉันพิมพ์ "blah.py foo" มันจะดำเนินการคำสั่งที่แน่นอนนี้โดยไม่มีผลลัพธ์ที่แตกต่างไปกว่าถ้าฉันพิมพ์ตัวเต็มด้วยตัวเอง:

    "c: \ python26 \ python.exe" "blah.py" foo

หากคุณพิมพ์สิ่งเดียวกันรวมถึงเครื่องหมายคำพูดคุณจะได้ผลลัพธ์ที่เหมือนกับเมื่อคุณพิมพ์ "blah.py foo" ตอนนี้คุณอยู่ในฐานะที่จะคิดหาปัญหาที่เหลือด้วยตัวคุณเอง

(หรือโพสต์ข้อมูลที่เป็นประโยชน์เพิ่มเติมในคำถามของคุณเช่นสำเนาจริงที่ตัดแล้ววางของสิ่งที่คุณเห็นในคอนโซลโปรดทราบว่าผู้ที่ทำสิ่งเหล่านี้จะได้รับการโหวตจากคำถามและได้รับคะแนนชื่อเสียงและผู้คนจำนวนมากขึ้น มีแนวโน้มที่จะช่วยให้พวกเขามีคำตอบที่ดี)

นำเข้ามาจากความคิดเห็น:

แม้ว่าการเชื่อมโยงและ ftype จะแสดงข้อมูลที่ถูกต้อง แต่ก็อาจเกิดขึ้นได้ว่าอาร์กิวเมนต์ถูกตัดออก สิ่งที่อาจช่วยได้ในกรณีนั้นคือการแก้ไขคีย์รีจิสทรีที่เกี่ยวข้องโดยตรงสำหรับ Python ตั้งค่า

HKEY_CLASSES_ROOT\Applications\python26.exe\shell\open\command

กุญแจสำคัญในการ:

"C:\Python26\python26.exe" "%1" %*

ก่อนหน้านี้น่าจะ%*หายไป ในทำนองเดียวกันตั้ง

 HKEY_CLASSES_ROOT\py_auto_file\shell\open\command

เป็นค่าเดียวกัน ดูhttp://eli.thegreenplace.net/2010/12/14/problem-passing-arguments-to-python-scripts-on-windows/

ตัวอย่างการตั้งค่ารีจิสทรีสำหรับ python.exe HKEY_CLASSES_ROOT\Applications\python.exe\shell\open\commandเส้นทางรีจิสทรีอาจแตกต่างกันไปใช้python26.exeหรือpython.exeหรือแล้วแต่สิ่งที่มีอยู่แล้วในรีจิสทรี

ป้อนคำอธิบายภาพที่นี่ HKEY_CLASSES_ROOT\py_auto_file\shell\open\command


30
แม้ว่าassocและftypeแสดงข้อมูลที่ถูกต้อง แต่ก็อาจเกิดขึ้นได้ว่าอาร์กิวเมนต์ถูกตัดออก สิ่งที่อาจช่วยได้ในกรณีนั้นคือการแก้ไขคีย์รีจิสทรีที่เกี่ยวข้องสำหรับ Python โดยตรง ตั้งค่าHKEY_CLASSES_ROOT\Applications\python26.exe\shell\open\commandคีย์เป็น: "C:\Python26\python26.exe" "%1" %* ก่อนหน้านี้น่าจะ%*หายไป ในทำนองเดียวกันให้ตั้งค่าHKEY_CLASSES_ROOT\py_auto_file\shell\open\commandเป็นค่าเดียวกัน ดูeli.thegreenplace.net/2010/12/14/…
parvus

5
@parvus ความคิดเห็นของคุณเป็นทางออกที่ดีที่สุดสำหรับฉัน แม้จะมีการอ่านการเชื่อมโยงอย่างถูกต้อง แต่ทั้งสองปุ่มนี้ก็ถูกตั้งค่าไม่ถูกต้อง
Nathan Cox

1
ฉันยังพบปัญหากับ HKEY_CLASSES_ROOT \ .py \ OpenWithProgids ที่ถูกตั้งค่าเป็นบางสิ่งที่เกี่ยวข้องกับ VisualStudio โดยเฉพาะเมื่อฉันพยายามเรียกใช้สคริปต์ Python ในการทดสอบ AppVeyor ของฉัน ดูhelp.appveyor.com/discussions/pro issues/ ….
Jack O'Connor

1
ฉันมีปัญหาที่คล้ายกัน Anaconda ตามค่าเริ่มต้นเพิ่มคีย์รีจิสทรีโดยไม่มี% *
prasad

ใน Win10 ฉันเขียนtest.py 123และ123พิมพ์เป็นsys.argv[1]ไฟล์. Microsoft เปลี่ยนแปลงอะไรบางอย่างหรือไม่?
Hrvoje T

22

คุณควรทำให้แอปพลิเคชันเริ่มต้นจัดการไฟล์ python เป็น python.exe

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

จากนั้นไฟล์ python ของคุณจะทำงานโดยใช้ python.exe เสมอ


16

นอกจากนี้หากคุณต้องการเรียกใช้สคริปต์ python ของคุณโดยไม่ต้องพิมพ์.py(หรือ.pyw) ที่ท้ายชื่อไฟล์คุณต้องเพิ่ม.PY(หรือ.PY;.PYW) ในรายการส่วนขยายในตัวแปรสภาพแวดล้อม PATHEXT

ใน Windows 7:

คลิกขวาที่คอมพิวเตอร์
คลิก
ซ้ายคุณสมบัติคลิกซ้ายการตั้งค่าระบบขั้นสูงคลิก
ซ้ายแท็บขั้นสูงคลิก
ซ้ายตัวแปรสภาพแวดล้อม ...
ภายใต้ "ตัวแปรระบบ" เลื่อนลงไปจนกว่าคุณจะเห็น PATHEXT
คลิกซ้ายที่ PATHEXT เพื่อไฮไลต์ไปทาง
ซ้าย คลิกแก้ไข ...
แก้ไข "ค่าตัวแปร" เพื่อให้มี;.PY (ปุ่มสิ้นสุดจะข้ามไปที่จุดสิ้นสุด)
คลิก
ซ้ายตกลงคลิก
ซ้ายตกลงคลิกซ้ายตกลง

หมายเหตุ # 1: หน้าต่างพร้อมรับคำสั่งจะไม่เห็นการเปลี่ยนแปลงที่ไม่มีการปิดและเปิดใหม่

หมายเหตุ # 2: ความแตกต่างระหว่าง.pyและ.pywส่วนขยายคือก่อนหน้านี้เปิดพรอมต์คำสั่งเมื่อเรียกใช้และส่วนหลังไม่เปิด

ในคอมพิวเตอร์ของฉันฉันได้เพิ่ม;.PY;.PYWส่วนขยายสุดท้าย (ลำดับความสำคัญต่ำสุด) ดังนั้นค่า "before" และ "after" ของ PATHEXT จึงเป็น:

ก่อน: .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC

หลังจาก .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY;.PYW

คำสั่งสอนมีดังนี้:

C:\>echo %pathext%
.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY;.PYW

C:\>assoc .py
.py=Python.File

C:\>ftype Python.File
Python.File="C:\Python32\python.exe" "%1" %*

C:\>assoc .pyw
.pyw=Python.NoConFile

C:\>ftype Python.NoConFile
Python.NoConFile="C:\Python32\pythonw.exe" "%1" %*

C:\>type c:\windows\helloworld.py
print("Hello, world!")  # always use a comma for direct address

C:\>helloworld
Hello, world!

C:\>

4

วิธีเรียกใช้สคริปต์ Python ใน Windows

คุณสามารถติดตั้งpylauncher ใช้เพื่อเปิดไฟล์. py, .pyw, .pyc, .pyo และรองรับการติดตั้ง Python หลายตัว:

T\:> blah.py argument

คุณสามารถรันสคริปต์ Python ได้โดยไม่ต้องระบุนามสกุล. py หากคุณมี. py, .pyw ในตัวแปรสภาพแวดล้อม PATHEXT:

T:\> blah argument

เพิ่มการสนับสนุนสำหรับ shebang ( #!บรรทัดส่วนหัว) เพื่อเลือกเวอร์ชัน Python ที่ต้องการบน Windows หากคุณติดตั้งหลายเวอร์ชัน #! /usr/bin/env pythonคุณสามารถใช้ไวยากรณ์ * ระวังที่เข้ากันได้

คุณสามารถระบุเวอร์ชันอย่างชัดเจนเช่นเพื่อเรียกใช้โดยใช้ Python 3 เวอร์ชันล่าสุดที่ติดตั้ง:

T:\> py -3 blah.py argument

นอกจากนี้ควรแก้ไขปัญหาของคุณsys.argvเป็นผลข้างเคียง


Python Launcher อยู่ในสถานะเบต้า
Nicolas Barbulesco

@NicolasBarbulesco: ตัวเรียกใช้ Python รวมอยู่ใน Python 3.3เช่นมันดีพอ
jfs

อาจจะ. แต่ผมไม่ได้ประสบความสำเร็จในการติดตั้ง 3 หลามบน Windows บางทีคุณอาจช่วยฉันได้ที่นี่
Nicolas Barbulesco

4

ฉันพบปัญหาเดียวกัน แต่ในบริบทที่จำเป็นต้องจัดแพคเกจรหัสของฉันสำหรับผู้ใช้ Windows (มาจาก Linux) แพ็คเกจของฉันมีสคริปต์จำนวนหนึ่งพร้อมตัวเลือกบรรทัดคำสั่ง

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

ฉันเจอวิธีแก้ปัญหาที่คนใน Continuum ใช้สำหรับสคริปต์ Python ที่มาพร้อมกับแพ็คเกจ Anaconda ของพวกเขา - ตรวจสอบไดเรกทอรี Anaconda / Scripts ของคุณเพื่อดูตัวอย่าง

สำหรับสคริปต์ Python testให้สร้างสองไฟล์: a test.batและtest-script.py.

test.batมีลักษณะดังนี้ ( .batไฟล์ที่Anaconda\Scriptsเรียกpython.exeด้วยเส้นทางสัมพัทธ์ซึ่งฉันปรับให้เหมาะกับวัตถุประสงค์ของฉัน):

@echo off
set PYFILE=%~f0
set PYFILE=%PYFILE:~0,-4%-script.py
"python.exe" "%PYFILE%" %*

test-script.py เป็นสคริปต์ Python จริงของคุณ:

import sys
print sys.argv

หากคุณทิ้งสองไฟล์นี้ไว้ในไดเร็กทอรีภายในของคุณคุณสามารถเรียกใช้สคริปต์ Python ของคุณผ่าน.batไฟล์โดยทำ

test.bat hello world
['C:\\...\\test-scripy.py', 'hello', 'world']

หากคุณคัดลอกทั้งสองไฟล์ไปยังตำแหน่งที่อยู่บนPATH(เช่นAnaconda\Scripts) ของคุณคุณสามารถเรียกใช้สคริปต์ของคุณได้โดย.batเว้นส่วนต่อท้าย

test hello world
['C:\\...Anaconda\\Scripts\\test-scripy.py', 'hello', 'world']

คำเตือน: ฉันไม่รู้ว่าเกิดอะไรขึ้นและมันทำงานอย่างไรจึงขอขอบคุณคำอธิบายใด ๆ


การสร้าง.batWrapper สำหรับสคริปต์ Python แต่ละสคริปต์นั้นยุ่งยากและซ้ำซ้อน ฉันจะไม่แนะนำสิ่งนี้
tripleee

2

บนวินโดวส์ ,

การเรียกใช้โมดูลหลามโดยไม่ต้องพิมพ์ "งูใหญ่" ,

-> คลิกขวาที่ไฟล์ python (*. py)

-> ตั้งค่าคุณสมบัติ open with เป็น "python.exe"

-> เลือก "ใช้โปรแกรมนี้เสมอสำหรับไฟล์ประเภทนี้"

-> ผนวกพา ธ ของ python.exe เข้ากับสภาพแวดล้อมตัวแปรเช่นผนวก C: \ Python27 เข้ากับตัวแปรสภาพแวดล้อม PATH

ในการเรียกใช้โมดูล python โดยไม่ต้องพิมพ์นามสกุล ".py"

-> แก้ไขตัวแปรระบบ PATHEXT และต่อท้ายส่วนขยาย ".PY" ในรายการ


1

พบคำตอบที่มีประโยชน์อย่างไม่น่าเชื่อที่นี่ : จะเรียกใช้ python เวอร์ชันต่างๆใน cmd ได้อย่างไร?

ฉันขอแนะนำให้ใช้ยูทิลิตี้ Python Launcher สำหรับ Windows ที่เปิดตัวใน Python 3.3 เมื่อไม่นานมานี้ คุณยังสามารถดาวน์โหลดและติดตั้งด้วยตนเองได้โดยตรงจากเว็บไซต์ของผู้เขียนเพื่อใช้กับ Python 2 และ 3 เวอร์ชันก่อนหน้า

ไม่ว่าคุณจะได้รับมันมาอย่างไรหลังจากการติดตั้งมันจะเชื่อมโยงตัวเองกับนามสกุลไฟล์ Python มาตรฐานทั้งหมด (เช่นไฟล์. py, .pyw, .pyc และ. pyo) คุณไม่เพียง แต่สามารถควบคุมได้อย่างชัดเจนว่าจะใช้เวอร์ชันใดที่พรอมต์คำสั่ง แต่ยังใช้สคริปต์ทีละสคริปต์ด้วยการเพิ่มความคิดเห็นของ Linux / Unix-y shebang #! / usr / bin / env pythonX ที่ จุดเริ่มต้นของสคริปต์ Python ของคุณ

ตามที่ JF Sebastian แนะนำPython Launcher สำหรับ Windowsเป็นตัวเลือกที่ดีที่สุดและเป็นค่าเริ่มต้นสำหรับการเปิดตัว Python เวอร์ชันต่างๆใน Windows เคยเป็นเครื่องมือของบุคคลที่สาม แต่ตอนนี้ได้รับการสนับสนุนอย่างเป็นทางการตั้งแต่ Python 3.3

ใหม่ในเวอร์ชัน 3.3

Python launcher สำหรับ Windows เป็นยูทิลิตี้ที่ช่วยในการระบุตำแหน่งและการเรียกใช้ Python เวอร์ชันต่างๆ อนุญาตให้สคริปต์ (หรือบรรทัดคำสั่ง) ระบุการตั้งค่าสำหรับเวอร์ชัน Python เฉพาะและจะค้นหาและเรียกใช้เวอร์ชันนั้น

นี่เป็นเครื่องมือที่ยอดเยี่ยมเพียงแค่ใช้มัน!


0

คุณสามารถเรียกใช้ python.exe จากแผนที่ใด ๆ ได้หรือไม่? ถ้าคุณไม่มีให้ตรวจสอบว่าคุณมีค่าที่เหมาะสมสำหรับ python.exe ในสภาพแวดล้อม PATH หรือไม่

คุณอยู่ในไดเรกทอรีเดียวกันกับ blah.py หรือไม่ ตรวจสอบสิ่งนี้โดยออกคำสั่ง -> แก้ไข blah.py และตรวจสอบว่าคุณสามารถเปิดไฟล์นี้ได้หรือไม่

แก้ไข:

ในกรณีนั้นคุณไม่สามารถทำได้ ( python argหมายความว่าคุณเรียก python.exe บางพารามิเตอร์ซึ่ง python ถือว่าเป็นชื่อไฟล์ของสคริปต์ที่คุณต้องการเรียกใช้)

คุณสามารถสร้างไฟล์ batเส้นเล็ก ๆ ในแผนที่เส้นทางของคุณและเรียกใช้ไฟล์. bat

ตัวอย่าง:
ในหนึ่งในแผนที่เส้นทางให้สร้าง ไฟล์แก้ไขblah.py.batและใส่บรรทัด

python C:\Somedir\blah.py

ตอนนี้คุณสามารถเรียกใช้ blah.py ได้จากทุกที่เพราะคุณไม่จำเป็นต้องใส่. bat extention เมื่อเรียกใช้ไฟล์ bat


หลามใน PATH และไดเร็กทอรีที่มี blah.py อยู่ใน PATH ด้วย แนวคิดหลักคือการรันสคริปต์ python โดยไม่ต้องเขียนเส้นทางแบบเต็ม แต่ตอนนี้ฉันมีปัญหากับการโต้แย้ง
ton4eg

3
Ralu คุณไม่จำเป็นต้องมีไฟล์แบตช์ในการรันสคริปต์ python ด้วยวิธีนี้ ใช้สภาพแวดล้อม PATHEXT เพื่อรวม. py และ. pyw เป็นส่วนขยายที่เรียกใช้งานได้ var นี้คือสาเหตุที่คุณไม่จำเป็นต้องระบุ. bat เช่นกัน
ทอดด์

0

ถ้านั่นคือสิ่งที่ฉันเข้าใจมันเป็นเช่นนี้:

C:\Users\(username)\AppData\Local\Programs\Python\Python(version)

คัดลอก (ไม่ลบ) python.exe และเปลี่ยนชื่อเป็น py.exe และดำเนินการ:

py filename.py

0

เพียงเรียกใช้คำสั่ง:

C:>python .\file_name.py

สมมติว่าชื่อไฟล์อยู่ในโฟลเดอร์เดียวกันและมีการเพิ่ม Python ลงในตัวแปรสภาพแวดล้อมแล้ว

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