2010-02-27 19 views
8

Giả sử chúng ta có một tập lệnh Python do.py và chúng tôi muốn có thể gọi nó là không có phần mở rộng, như do hoặc ./do.Làm thế nào để chạy tập lệnh python mà không chỉ định phần mở rộng của tệp (giải pháp nền tảng chéo)?

Nếu chúng tôi đổi tên tệp từ do.py thành do và đảm bảo chúng tôi có một dòng shebang hợp lệ, nó sẽ hoạt động trên mọi nền tảng nhưng Windows. Trên Windows không có cách nào để thực thi tệp mà không có phần mở rộng.

Trên Windows, nếu chúng tôi giữ nguyên phần mở rộng tệp gốc, chúng tôi có thể gọi tập lệnh mà không có tên đầy đủ vì trình cài đặt Python đăng ký phần mở rộng .py dưới dạng tệp thực thi.

Có vẻ như chúng tôi cần phân phối cùng một tập lệnh dưới hai tên khác nhau để gọi nó trên môi trường Windows và không phải Windows. Tôi thực sự không thích điều này và tôi đang tìm kiếm một giải pháp mà không có dự phòng này.

Một cách tiếp cận phổ biến khác về việc này là thêm tệp hàng loạt bao gói do.cmd đang gọi tệp do.py gốc. Đây có ít nhất một vấn đề lớn: nó phá vỡ các tổ hợp phím Ctrl + C/Ctrl + Break vì không có cách nào để ngăn chặn cmd.exe từ nhắc bạn với Terminate batch job? (Y/N) message.

Nếu chúng ta muốn sử dụng một wrapper chúng ta cần phải chắc chắn rằng:

  • bù lại errorcode (errorlevel) trả về bởi kịch bản gốc
  • nó sẽ không thay đổi môi trường
  • nó sẽ tái sử dụng cùng một giao diện điều khiển (không có cửa sổ mới)
  • không can thiệp vào STDOUT, STDIN hoặc STDERR
  • thể thân thiện với Ctrl-C (không có nhắc nhở)

Tôi cho rằng các giải pháp tối ưu vẫn là sử dụng một wrapper. Hàng loạt sẽ không hoạt động, thực thi có nguồn gốc sẽ thêm rất nhiều phức tạp vì vậy có lẽ một wrapper đã viết trong python chính nó sẽ làm.

+0

có thể là câu trả lời nằm trong câu hỏi "tại sao bạn muốn có thể gọi nó mà không có phần mở rộng"? –

+0

Chà, có rất nhiều công việc không có lợi ích thực sự. Có gì sai với do.py? Đó là một nền tảng hoàn hảo và không có công việc gì cả. –

+7

Đối với những người tự hỏi: không có phần mở rộng có nghĩa là chúng ta ẩn chi tiết thực hiện: ví dụ: nếu năm tới tôi muốn thay thế tập lệnh Python hiện tại bằng tập lệnh Ruby, tôi không muốn thay đổi tất cả cuộc gọi đến tập lệnh. Một đối số ít quan trọng hơn: ít để viết từ dòng lệnh. – sorin

Trả lời

2

Cho đến nay tôi đã đưa ra giải pháp này mà đường nối hoạt động.Tạo một file yourname.py với nội dung này:

import os, sys 
filename = os.path.splitext(os.path.basename(sys.argv[0]))[0] 
if not os.path.exists(filename): 
    # filename does not exists, we will emulate cmd behaviour 
    sys.stderr.write("'%s' is not recognized as an internal or external command,\noperable program or batch file." % filename) 
    sys.exit(9009) 
ret = os.system("python %s %s" % (
     filename, 
     " ".join(sys.argv[1:]) 
     )) 
exit(ret) 
+0

Liên quan: [Windows - chạy .py trực tiếp vs chạy python blah.py hành xử khác nhau] (http://stackoverflow.com/q/7104920/) –

0

bạn luôn có thể gọi tập lệnh của mình bằng trình thông dịch Python. Bạn nhận được sự nhất quán tương tự trong * nix, khi bạn sử dụng trình thông dịch.

của Windows

c:\> python c:\path\to\myscript 

* nix

$ python /path/to/myscript 

Nếu nó không phải những gì bạn muốn, sau đó tôi đang mis-giải thích câu hỏi của bạn.

+1

Đó không phải là điều anh ta muốn. Anh ta muốn chạy nó giống như bất kỳ tệp thực thi nào khác trong hệ thống - mà không chỉ rõ bất cứ điều gì trừ tên của tập lệnh thực thi (script) trong dòng lệnh. –

1

Bạn có thể sử dụng các đoạn mã để cài đặt tập lệnh vào cài đặt Python (ví dụ: công cụ easy_install được cài đặt như vậy).

Đối với Windows, bạn có thể sử dụng py2exe để tạo tập lệnh có thể được thực thi mà không có phần mở rộng tệp. Trên Linux, bạn có thể chỉ cần sử dụng một tệp không có phần mở rộng, nhưng bao gồm một dòng shebang.

+0

Nếu bạn cài đặt tập lệnh, bạn có thể chạy tập lệnh đó bằng 'python -m moduleName'. Đó cũng là nền tảng đa nền tảng. –

5

Trên cửa sổ tôi đã thêm phần mở rộng 'py' vào biến môi trường 'PATHEXT' và làm việc cho tôi - nếu file py được lưu trữ trong một thư mục đó là một phần của biến môi trường 'PATH'.

C:\>echo %PATHEXT% 
.COM;.EXE;.BAT;.CMD;.PY;.JS;.JSE 
+0

Điều này làm việc cho tôi trong vỏ lệnh nhưng đối với dấu nhắc Chạy mà tôi đã thêm một giả "python_script.exe" chìa khóa để đăng ký - HKLM \ Software \ Microsoft \ Windows \ CurrentVersion \ App Đường dẫn \ Sau đó, tôi thiết lập giá trị mặc định cho đường dẫn python_script.py của tôi và sau đó tôi đã có thể chỉ cần gõ "python_script" trong Chạy lời nhắc. –

+0

Nhưng cách này cũng hoạt động trên không phải Windows? Tôi có thể gõ 'do' mà không có phần mở rộng? – Hugo

4

Viết mô-đun Python chính của bạn với tiện ích mở rộng .py. Thiết lập PATHEXT chính xác và nó sẽ chạy trên Windows mà không cần phải nhập phần mở rộng.

Trên Unix, hãy viết chương trình Python thứ hai chỉ đơn giản là nhập khẩu đầu tiên, sử dụng cú pháp cô-bang. Không có phần mở rộng trên tập tin này - đó là một kịch bản shell. Như thế này:

#!/usr/bin/env python 
import do 

Điều này sẽ có tác dụng nhập do.py.

Chỉ do cần được đánh dấu là tệp thực thi cho Unix. do.py là một mô-đun trong môi trường đó.

Khi bạn nhập mô-đun, mã trong mô-đun sẽ chạy một lần.

Nó không hoàn toàn loại bỏ sự thừa, nhưng nó gần. Và nó có lẽ là giải pháp tốt nhất có thể cho kịch bản đa nền tảng.

+1

Đó là giải pháp đối xứng với giải pháp được OP đưa ra nhưng nó đơn giản hơn, do đó có vẻ tốt hơn. –

0

Jason's answer là rõ ràng và đơn giản hơn, nhưng một phiên bản generic được tên mô-đun từ filename:

#!/usr/bin/env python 
import importlib, os, sys 
importlib.import_module(os.path.basename(sys.argv[0])) 

Có nói rằng, tôi thích Jason, nơi đó là ngay lập tức rõ ràng những gì đang xảy ra:

#!/usr/bin/env python 
import do 
Các vấn đề liên quan