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.
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"? –
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ả. –
Đố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