Tôi đang ở trong một tình huống thú vị khi tôi có một tập lệnh Python có thể được điều hành theo lý thuyết bởi nhiều người dùng với nhiều môi trường (và PATH) và trên nhiều hệ thống Linux. Tôi muốn kịch bản này có thể được thực thi trên càng nhiều trong số này càng tốt mà không bị hạn chế giả tạo. Dưới đây là một số thiết lập được biết đến:
- Python 2.6 là phiên bản Python của hệ thống, vì vậy python, python2 và python2.6 đều tồn tại trong / usr / bin (và tương đương).
- Python 2.6 là phiên bản Python của hệ thống, như trên, nhưng Python 2.7 được cài đặt cùng với nó là python2.7.
- Python 2.4 là phiên bản Python hệ thống, mà kịch bản của tôi không hỗ trợ. Trong / usr / bin, chúng ta có python, python2 và python2.4 tương đương và python2.5, mà script hỗ trợ.
Tôi muốn chạy cùng một kịch bản python thực thi trên cả ba. Sẽ thật tuyệt nếu nó đã thử sử dụng /usr/bin/python2.7 trước, nếu nó tồn tại, sau đó quay lại /usr/bin/python2.6, sau đó quay lại /usr/bin/python2.5, sau đó chỉ đơn giản là lỗi nếu không có ai trong số họ có mặt. Tuy nhiên, tôi không quá bận tâm với nó bằng cách sử dụng 2.x gần đây nhất có thể, miễn là nó có thể tìm thấy một trong những thông dịch viên chính xác nếu có.
Xu hướng đầu tiên của tôi là thay đổi dòng shebang từ:
#!/usr/bin/python
đến
#!/usr/bin/python2.[5-7]
vì điều này hoạt động tốt trong bash. Nhưng chạy tập lệnh cho:
/usr/bin/python2.[5-7]: bad interpreter: No such file or directory
Được rồi, vì vậy tôi thử cách sau, cũng hoạt động trong bash:
#!/bin/bash -c /usr/bin/python2.[5-7]
Nhưng một lần nữa, điều này thất bại với:
/bin/bash: - : invalid option
Được rồi, rõ ràng tôi chỉ có thể viết một tập lệnh shell riêng biệt để tìm trình thông dịch chính xác và chạy tập lệnh python bằng cách sử dụng bất kỳ trình thông dịch nào nó tìm thấy. Tôi chỉ thấy rắc rối khi phân phối hai tệp trong đó một tệp sẽ đủ miễn là nó chạy với trình thông dịch python 2 cập nhật nhất được cài đặt. Yêu cầu mọi người gọi trình thông dịch một cách rõ ràng (ví dụ $ python2.5 script.py
:) không phải là một lựa chọn. Dựa vào PATH của người dùng được thiết lập theo một cách nhất định cũng không phải là một lựa chọn.
Biên tập:
Kiểm tra phiên bản trong tập lệnh Python sẽ không hoạt động vì tôi đang sử dụng câu lệnh "with" tồn tại kể từ Python 2.6 (và có thể được sử dụng trong 2.5 với from __future__ import with_statement
). Điều này khiến tập lệnh thất bại ngay lập tức với SyntaxError không thân thiện với người dùng và ngăn tôi không có cơ hội kiểm tra phiên bản trước và phát ra lỗi thích hợp.
Ví dụ: (thử điều này với trình thông dịch Python nhỏ hơn 2.6)
#!/usr/bin/env python
import sys
print "You'll never see this!"
sys.exit()
with open('/dev/null', 'w') as out:
out.write('something')
./script.py
) sẽ khiến python2.4 thực thi nó, điều này sẽ khiến mã của bạn phát hiện ra rằng đó là phiên bản sai (và có lẽ là thoát). Nhưng có một python2.5 hoàn toàn tốt có thể được sử dụng làm thông dịch viên thay thế!
exec
nếu có thì in lỗi.
execve
). Các đối số là chuỗi ký tự, không có Globing, không regexps. Đó là nó. Ngay cả khi đối số thứ nhất là "/ bin / bash" và các tùy chọn thứ hai ("-c ..."), các tùy chọn đó không được phân tách bằng shell. Chúng không được xử lý cho bash thực thi, đó là lý do tại sao bạn nhận được những lỗi đó. Thêm vào đó, shebang chỉ hoạt động nếu nó bắt đầu. Vì vậy, bạn đã hết may mắn ở đây, tôi sợ (thiếu một đoạn script tìm một trình thông dịch python và cung cấp cho nó một tài liệu TẠI ĐÂY, nghe có vẻ như một mớ hỗn độn khủng khiếp).
import sys; sys.version_info()
để kiểm tra xem người dùng có phiên bản python cần thiết hay không.