Làm thế nào để thực thi các tập lệnh Python trong Windows?


91

Tôi có một tập lệnh đơn giản blah.py (sử dụng Python 2):

import sys
print sys.argv[1]

Nếu tôi thực thi tập lệnh của mình bằng cách:

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

Nó in đối số nhưng nếu tôi thực thi tập lệnh bằng cách:

blah.py argument

lỗi xảy ra:

IndexError ...

Vì vậy, các đối số không được chuyển sang script.

python.exe trong PATH. Thư mục với blah.py cũng trong PATH.
python.exe là chương trình mặc định để thực thi các tệp * .py.

Vấn đề là gì?


3
đăng một đoạn mã có thể giúp chúng tôi giúp bạn.
jldupont

Người đàn ông không có quả cầu kết tinh đã đưa ra giải pháp =) print sys.argv [1] tạo ra lỗi này.
ton4eg

Nếu bạn đã cài đặt nhiều phiên bản Python, bạn có thể cần stackoverflow.com/questions/1934675/… này .
laike9m

Yêu cầu python chạy tập lệnh của tôi từ sổ đăng ký theo cách thủ công: "C: \ Python27 \ python.exe" "C: \ Python27 \ tpt.py" "% 1" `

Câu trả lời:


144

Khi bạn thực thi một tập lệnh mà không nhập "python" ở phía trước, bạn cần biết hai điều về cách Windows gọi chương trình. Đầu tiên là tìm hiểu loại tệp mà Windows nghĩ đó là:

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

Tiếp theo, bạn cần biết cách Windows đang thực thi mọi thứ với tiện ích mở rộng đó. Nó được liên kết với loại tệp "Python.File", vì vậy lệnh này hiển thị những gì nó sẽ làm:

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

Vì vậy, trên máy của tôi, khi tôi nhập "blah.py foo", nó sẽ thực thi lệnh chính xác này, không có sự khác biệt về kết quả so với khi tôi đã tự nhập toàn bộ:

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

Nếu bạn nhập cùng một thứ, bao gồm cả dấu ngoặc kép, thì bạn sẽ nhận được kết quả giống như khi bạn chỉ nhập "blah.py foo". Bây giờ bạn đã có thể tự tìm ra phần còn lại của vấn đề.

(Hoặc đăng thông tin hữu ích hơn trong câu hỏi của bạn, chẳng hạn như bản sao cắt và dán thực tế của những gì bạn thấy trong bảng điều khiển. Lưu ý rằng những người làm loại điều đó sẽ được bình chọn cho câu hỏi của họ và họ nhận được điểm danh tiếng và nhiều người hơn có khả năng giúp họ có câu trả lời tốt.)

Nhận được từ các bình luận:

Ngay cả khi assoc và ftype hiển thị thông tin chính xác, có thể xảy ra trường hợp các đối số bị loại bỏ. Điều có thể giúp ích trong trường hợp đó là trực tiếp sửa các khóa đăng ký có liên quan cho Python. Đặt

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

chìa khóa cho:

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

Có thể, trước đây, %*đã bị mất tích. Tương tự, đặt

 HKEY_CLASSES_ROOT\py_auto_file\shell\open\command

đến cùng một giá trị. Xem http://eli.thegreenplace.net/2010/12/14/problem-passing-arguments-to-python-scripts-on-windows/

ví dụ cài đặt đăng ký cho python.exe HKEY_CLASSES_ROOT\Applications\python.exe\shell\open\commandĐường dẫn đăng ký có thể khác nhau, sử dụng python26.exehoặc python.exehoặc bất kỳ cái nào đã có trong sổ đăng ký.

nhập mô tả hình ảnh ở đây HKEY_CLASSES_ROOT\py_auto_file\shell\open\command


30
Ngay cả khi assocftypehiển thị thông tin chính xác, có thể xảy ra trường hợp các đối số bị loại bỏ. Điều có thể giúp ích trong trường hợp đó là trực tiếp sửa các khóa đăng ký liên quan cho Python. Đặt HKEY_CLASSES_ROOT\Applications\python26.exe\shell\open\commandkhóa thành: "C:\Python26\python26.exe" "%1" %* Có thể, trước đây, %*đã bị thiếu. Tương tự, đặt thành HKEY_CLASSES_ROOT\py_auto_file\shell\open\commandcùng một giá trị. Xem eli.thegreenplace.net/2010/12/14/…
parvus

5
@parvus Nhận xét của bạn là giải pháp cuối cùng cho tôi. Ngay cả khi các liên kết đọc chính xác, cả hai phím này đều được đặt không chính xác.
Nathan Cox

1
Tôi cũng gặp phải sự cố với HKEY_CLASSES_ROOT \ .py \ OpenWithProgids được đặt thành thứ gì đó liên quan đến VisualStudio, cụ thể là khi tôi cố gắng chạy các tập lệnh Python trong các thử nghiệm AppVeyor của mình. Xem help.appveyor.com/discussions/problems/… .
Jack O'Connor

1
Tôi có vấn đề tương tự. Anaconda theo mặc định đã thêm khóa đăng ký bị thiếu% *
prasad

Trong Win10, tôi viết test.py 123và tôi được 123in dưới dạng sys.argv[1]. Microsoft đã thay đổi điều gì đó?
Hrvoje T

22

bạn nên đặt ứng dụng mặc định để xử lý các tệp python là python.exe.

nhấp chuột phải vào tệp * .py, chọn hộp thoại "Mở Bằng". Trong đó, chọn "python.exe" và chọn "luôn sử dụng chương trình này cho loại tệp này" (đại loại như vậy).

thì các tệp python của bạn sẽ luôn được chạy bằng python.exe


16

Ngoài ra, nếu bạn muốn có thể chạy các tập lệnh python của mình mà không cần nhập .py(hoặc .pyw) ở cuối tên tệp, bạn cần thêm .PY(hoặc .PY;.PYW) vào danh sách các phần mở rộng trong biến môi trường PATHEXT.

Trong Windows 7:

nhấp chuột phải vào Máy tính nhấp chuột
trái vào Thuộc tính nhấp chuột
trái Cài đặt hệ thống nâng cao nhấp chuột
trái vào tab Nâng cao
nhấp chuột trái Biến môi trường ...
trong "biến hệ thống" cuộn xuống cho đến khi bạn thấy PATHEXT
, nhấp chuột trái vào PATHEXT để đánh dấu nó sang
trái- nhấp vào Chỉnh sửa ...
Chỉnh sửa "Giá trị biến" để nó chứa ;.PY (phím Kết thúc sẽ bỏ qua đến cuối)
nhấp chuột
trái vào OK nhấp chuột trái vào OK
trái vào OK nhấp chuột trái vào OK

Lưu ý # 1: Các cửa sổ nhắc lệnh sẽ không thấy thay đổi khi đóng và mở lại.

Lưu ý # 2: sự khác biệt giữa .py.pyw phần mở rộng phần mở rộng là phần mở rộng mở dấu nhắc lệnh khi chạy, còn phần mở rộng thì không.

Trên máy tính của mình, tôi đã thêm ;.PY;.PYW làm phần mở rộng cuối cùng (mức độ ưu tiên thấp nhất), vì vậy giá trị "trước" và "sau" của PATHEXT là:

trước: .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC

sau .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY;.PYW

Dưới đây là một số lệnh hướng dẫn:

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

Làm thế nào để thực thi các tập lệnh Python trong Windows?

Bạn có thể cài đặt pylauncher . Nó được sử dụng để khởi chạy các tệp .py, .pyw, .pyc, .pyo và hỗ trợ nhiều cài đặt Python:

T\:> blah.py argument

Bạn có thể chạy tập lệnh Python của mình mà không cần chỉ định phần mở rộng .py nếu bạn có .py, .pyw trong biến môi trường PATHEXT:

T:\> blah argument

Nó bổ sung hỗ trợ shebang ( #!dòng tiêu đề) để chọn phiên bản Python mong muốn trên Windows nếu bạn đã cài đặt nhiều phiên bản. Bạn có thể sử dụng cú pháp tương thích * nix #! /usr/bin/env python.

Bạn có thể chỉ định phiên bản một cách rõ ràng, ví dụ: để chạy bằng phiên bản Python 3 được cài đặt mới nhất:

T:\> py -3 blah.py argument

Nó cũng sẽ khắc phục sự cố của bạn sys.argvnhư một tác dụng phụ.


Python Launcher đang ở trạng thái beta.
Nicolas Barbulesco

@NicolasBarbulesco: Python phóng được bao gồm trong Python 3.3 tức là, nó là đủ tốt
JFS

Có lẽ. Nhưng tôi đã không thành công khi cài đặt Python 3 trên Windows . Có lẽ bạn có thể giúp tôi ở đây.
Nicolas Barbulesco

4

Tôi gặp phải vấn đề tương tự nhưng trong bối cảnh cần đóng gói mã của tôi cho người dùng Windows (đến từ Linux). Gói của tôi chứa một số tập lệnh với các tùy chọn dòng lệnh.

Tôi cần những tập lệnh này để được cài đặt ở vị trí thích hợp trên máy của người dùng Windows để họ có thể gọi chúng từ dòng lệnh. Vì gói được cho là thân thiện với người dùng, yêu cầu người dùng của tôi thay đổi sổ đăng ký của họ để chạy các tập lệnh này sẽ không thể.

Tôi đã tìm thấy một giải pháp mà những người tại Continuum sử dụng cho các tập lệnh Python đi kèm với gói Anaconda của họ - hãy xem thư mục Anaconda / Scripts của bạn để biết các ví dụ.

Đối với tập lệnh Python test, hãy tạo hai tệp: a test.batvà a test-script.py.

test.battrông như sau (các .battệp được Anaconda\Scriptsgọi python.exevới một đường dẫn tương đối mà tôi đã điều chỉnh cho mục đích của mình):

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

test-script.py là tập lệnh Python thực của bạn:

import sys
print sys.argv

Nếu bạn để hai tệp này trong thư mục cục bộ, bạn có thể gọi tập lệnh Python của mình thông qua .battệp bằng cách

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

Nếu bạn sao chép cả hai tệp vào một vị trí trên của bạn PATH(chẳng hạn như Anaconda\Scripts) thì bạn thậm chí có thể gọi tập lệnh của mình bằng cách bỏ đi .bathậu tố

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

Tuyên bố từ chối trách nhiệm: Tôi không biết chuyện gì đang xảy ra và cách thức hoạt động của nó và vì vậy tôi sẽ đánh giá cao bất kỳ lời giải thích nào.


Tạo một .battrình bao bọc cho mỗi tập lệnh Python là vụng về và thừa. Tôi sẽ không đề nghị này.
tripleee

2

Trên Windows ,

Để chạy mô-đun python mà không cần nhập "python" ,

-> Nhấp chuột phải vào bất kỳ tệp python (*. Py) nào

-> Đặt thuộc tính open with thành "python.exe"

-> Kiểm tra "luôn sử dụng chương trình này cho loại tệp này"

-> Nối đường dẫn của python.exe vào môi trường biến, ví dụ thêm C: \ Python27 vào biến môi trường PATH.

Để chạy mô-đun python mà không cần nhập phần mở rộng ".py"

-> Chỉnh sửa biến hệ thống PATHEXT và thêm phần mở rộng ".PY" vào danh sách.


1

Tìm thấy một câu trả lời cực kỳ hữu ích ở đây : Làm thế nào để chạy các phiên bản python khác nhau trong cmd?

Tôi sẽ đề xuất sử dụng tiện ích Python Launcher cho Windows đã được giới thiệu vào Python 3.3 một thời gian trước. Bạn cũng có thể tải xuống và cài đặt thủ công trực tiếp từ trang web của tác giả để sử dụng với các phiên bản Python 2 và 3 trước đó.

Bất kể bạn lấy nó bằng cách nào, sau khi cài đặt, nó sẽ tự liên kết với tất cả các phần mở rộng tệp Python tiêu chuẩn (tức là các tệp .py, .pyw, .pyc và .pyo). Bạn sẽ không chỉ có thể kiểm soát rõ ràng phiên bản nào được sử dụng tại dấu nhắc lệnh mà còn trên cơ sở từng tập lệnh bằng cách thêm các nhận xét Linux / Unix-y shebang #! / Usr / bin / env pythonX tại đầu các tập lệnh Python của bạn.

Như JF Sebastian gợi ý, Python Launcher cho Windows là lựa chọn mặc định và tốt nhất để khởi chạy phiên bản Python khác nhau trong Windows. Nó từng là một công cụ của bên thứ ba, nhưng bây giờ nó được hỗ trợ chính thức kể từ Python 3.3.

Mới trong phiên bản 3.3.

Trình khởi chạy Python dành cho Windows là một tiện ích hỗ trợ định vị và thực thi các phiên bản Python khác nhau. Nó cho phép các tập lệnh (hoặc dòng lệnh) chỉ ra tùy chọn cho một phiên bản Python cụ thể và sẽ định vị và thực thi phiên bản đó.

Đây là một công cụ tuyệt vời chỉ cần sử dụng nó!


0

Bạn có thể thực thi python.exe từ bất kỳ bản đồ nào không? Nếu bạn không, hãy kiểm tra xem bạn có các giá trị thích hợp cho python.exe trong môi trường PATH hay không

Bạn có ở cùng thư mục với blah.py. Kiểm tra điều này bằng cách ra lệnh -> chỉnh sửa blah.py và kiểm tra xem bạn có thể mở tệp này không

BIÊN TẬP:

Trong trường hợp đó bạn có thể không. ( python arg có nghĩa là bạn gọi python.exe với một số tham số mà python cho rằng đó là tên tệp của tập lệnh bạn muốn chạy)

Bạn có thể tạo các dòng bất kỳ của tệp bat trong bản đồ đường dẫn của mình và chạy tệp .bat

Ví dụ:
Trong một trong các bản đồ Đường dẫn, hãy tạo tệp blah.py.bat Chỉnh sửa và đặt dòng

python C:\Somedir\blah.py

Bây giờ bạn có thể chạy blah.py từ anywere, vì bạn không cần phải đặt phần mở rộng .bat khi chạy tệp bat


python trong PATH. Và thư mục chứa blah.py cũng trong PATH. Ý tưởng chính là thực thi tập lệnh python mà không cần viết đường dẫn đầy đủ đến nó. Nhưng bây giờ tôi gặp vấn đề với việc truyền các đối số.
ton4eg

3
Ralu, bạn không cần tệp lô để thực thi tập lệnh python theo cách này. Sử dụng var môi trường PATHEXT để bao gồm .py và .pyw làm phần mở rộng có thể thực thi. Var này là lý do tại sao bạn không cần chỉ định .bat.
Todd

0

Nếu đó là những gì tôi hiểu, nó sẽ như thế này:

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

SAO CHÉP (không xóa) python.exe và đổi tên thành py.exe và thực thi:

py filename.py

0

Chỉ cần chạy lệnh:

C:>python .\file_name.py

Giả sử tên tệp nằm trong cùng một thư mục và Python đã được thêm vào các biến môi trường.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.