Làm cách nào để yêu cầu tập lệnh Python sử dụng một phiên bản cụ thể


78

Làm cách nào để tôi, trong mô-đun main.py (có lẽ), cho Python biết nên sử dụng trình thông dịch nào? Ý tôi là: nếu tôi muốn một tập lệnh cụ thể sử dụng phiên bản 3 của Python để diễn giải toàn bộ chương trình, làm cách nào để làm điều đó?

Phần thưởng: Điều này sẽ ảnh hưởng đến virtualenv như thế nào? Tôi có đúng khi nghĩ rằng nếu tôi tạo một virtualenv cho chương trình của mình và sau đó yêu cầu nó sử dụng một phiên bản Python khác, thì tôi có thể gặp phải một số xung đột?

Câu trả lời:


55

Bạn có thể thêm một dòng shebang vào đầu tập lệnh:

#!/usr/bin/env python2.7

Nhưng điều đó sẽ chỉ hoạt động khi thực thi như ./my_program.py.

Nếu bạn thực thi dưới dạng python my_program.py, thì bất kỳ phiên bản Python nào which pythontrả về sẽ được sử dụng.

Trong re: to virtualenv sử dụng: virtualenv -p /usr/bin/python3.2hoặc bất cứ thứ gì để thiết lập nó để sử dụng tệp thực thi Python đó.


10
Để làm cho câu trả lời này hoàn chỉnh, có thể cần mô tả cú pháp she-bang thích hợp, vì câu hỏi được diễn đạt theo cách không hàm ý kiến ​​thức đó.
JB Bentley

Điều gì sẽ xảy ra nếu con đường quá dài cho shebang? Nó chỉ cho phép 128 ký tự. Chúng ta có nên đặt bí danh cho python trong một số install.pykhông?
Lukas

56

Có lẽ không chính xác những gì bạn hỏi, nhưng tôi thấy điều này rất hữu ích khi bắt đầu các chương trình của tôi:

import sys

if sys.version_info[0] < 3:
    raise Exception("Python 3 or a more recent version is required.")

Không phải gọi hàm kiểu dấu ngoặc vuông mới đối với python3? Mã này có hoạt động như mong đợi trong tất cả các phiên bản của python không?
TamaMcGlinn

1
@TamaMcGlinn Không chắc chính xác ý của bạn là gì; [0] có nghĩa là nó tham chiếu đến mục nhập đầu tiên trong mảng (trong trường hợp này có nghĩa là chữ số đầu tiên của phiên bản Python, ví dụ như trong 2.7.3, đây sẽ là 2), không thực hiện một cuộc gọi hàm. AFAIK này hoạt động trên tất cả các phiên bản của Python.
Gravity Grave

Lý do tôi phát hiện ra sự khác biệt giữa python2 và python3 là cố gắng thực hiện print "hello world"biên dịch. Tôi nghĩ chỉ là bản in báo cáo đã thay đổi, do đó tôi nhầm lẫn. Cảm ơn bạn đã làm rõ rằng điều này hoạt động trong tất cả các phiên bản Python vì đó là điều cần thiết.
TamaMcGlinn

21

Tôi sẽ sử dụng shebang #!/usr/bin/python (dòng mã đầu tiên) với số sê-ri của Python ở cuối;)

Sau đó, chạy tệp Python dưới dạng tập lệnh, ví dụ: ./main.pytừ dòng lệnh, thay vì chạy python main.py.

Điều này cũng tương tự khi bạn muốn chạy Python từ dòng lệnh Linux.


7
Vì vậy, nếu tôi muốn python 2.7.3, tôi sẽ sử dụng #! / Usr / bin / python2.7.3
jesuis

@MikeHalpin hãy xem có gì trong / usr / bin của bạn. Bạn cần tham chiếu đến một tệp thực thi hiện có. Nếu bạn đã cài đặt 2.7.3 thì tôi tin rằng bạn sẽ đúng.
Endophage

Không nên có bất kỳ lý do gì để chỉ định cụ thể 2.7.3 - tất cả 2.X hầu hết phải tương thích và 2.7.X hoàn toàn.
Erik

có, giống như python2.7 filename.py cho tất cả / mọi phiên bản python 2.7.x
geekidharsh

2
Lưu ý rằng điều này sẽ không hoạt động nếu bạn thực thi tập lệnh như bạn thường làm khi chạy tập lệnh python, tức là bằng cách chạy python <python-file>biểu mẫu đầu cuối.
HelloGoodbye

13

Mặc dù OP có thể đang làm việc trên nền tảng nix, câu trả lời này có thể giúp ích cho các nền tảng phi nix. Tôi chưa có kinh nghiệm làm việc theo phương pháp shebang trong Microsoft Windows.

Diễn đạt lại: Dòng shebang trả lời câu hỏi của bạn về " trong tập lệnh của tôi " nhưng tôi tin rằng chỉ dành cho các nền tảng giống Unix. Mặc dù nó là Unix shell, bên ngoài script, thực sự thông dịch dòng shebang để xác định phiên bản trình thông dịch Python nào sẽ gọi. Tôi không chắc, nhưng tôi tin rằng giải pháp đó không giải quyết được vấn đề cho người dùng nền tảng Microsoft Windows.

Trong thế giới Microsoft Windows, cách đơn giản hóa cách chạy một phiên bản Python cụ thể, không có biến môi trường được thiết lập cụ thể cho từng phiên bản Python cụ thể được cài đặt, chỉ bằng cách đặt tiền tố python.exe với đường dẫn bạn muốn chạy nó, chẳng hạn như C: \ Python25 \ python.exe mymodule.py hoặc D: \ Python27 \ python.exe mymodule.py

Tuy nhiên, bạn cần phải xem xét các biến môi trường PYTHONPATH và PYTHON ... khác sẽ trỏ đến phiên bản thư viện Python sai.

Ví dụ: bạn có thể chạy: C: \ Python2.5.2 \ python.exe mymodule

Tuy nhiên, các biến môi trường có thể trỏ đến phiên bản sai như:

PYTHONPATH = D: \ Python27

PYTHONLIB = D: \ Python27 \ lib

Tải về niềm vui khủng khiếp!

Vì vậy, một cách không phải virtualenv, trong Windows, sẽ là sử dụng một tệp loạt thiết lập môi trường và gọi một tệp thực thi Python cụ thể thông qua tiền tố python.exe với đường dẫn mà nó nằm trong đó. Cách này có các chi tiết bổ sung mà bạn sẽ có để quản lý mặc dù; chẳng hạn như sử dụng các đối số dòng lệnh cho một trong hai lệnh "start" hoặc "cmd.exe" để "lưu và thay thế môi trường" console "" nếu bạn muốn giao diện điều khiển tồn tại sau khi ứng dụng thoát.

Câu hỏi của bạn khiến tôi tin rằng bạn có một số mô-đun Python, mỗi mô-đun mong đợi một phiên bản Python nhất định. Điều này có thể được giải quyết "trong" tập lệnh bằng cách có một mô-đun khởi chạy sử dụng mô-đun quy trình con . Thay vì gọi mymodule.py, bạn sẽ gọi một mô-đun gọi mô-đun của bạn; có lẽ khởi chạy_mymodule.py

launc_mymodule.py

import sys
import subprocess
if sys.argv[2] == '272':
  env272 = {
    'PYTHONPATH': 'blabla',
    'PYTHONLIB': 'blabla', }
  launch272 = subprocess.Popen('D:\\Python272\\python.exe mymodule.py', env=env272)

if sys.argv[1] == '252'
  env252 = {
    'PYTHONPATH': 'blabla',
    'PYTHONLIB': 'blabla', }
  launch252 = subprocess.Popen('C:\\Python252\\python.exe mymodule.py', env=env252)

Tôi đã không thử nghiệm điều này.


1
Đây là tập lệnh hàng loạt MS, không phải virtualenv, kiểm tra phiên bản
DevPlayer

@DevPlayer Tập lệnh BATCH tuyệt vời và giải thích (trong liên kết). Một điều khác conlà bạn thực sự phải viết một tập lệnh python tùy chỉnh cho mọi phiên bản python mà bạn muốn thử nghiệm. Điều này không giống như OP sử dụng phiên bản python ưa thích của tập lệnh.
Jesse Chisholm

0

Bạn không thể làm điều này trong chương trình Python, bởi vì trình bao quyết định phiên bản nào sẽ sử dụng nếu bạn là một dòng shebang.

Nếu bạn không sử dụng shell có dòng shebang và chỉ cần nhập, python myprogram.pynó sẽ sử dụng phiên bản mặc định trừ khi bạn quyết định cụ thể phiên bản Python nào khi bạn nhập pythonXXX myprogram.pyphiên bản nào sẽ sử dụng.

Khi chương trình Python của bạn đang chạy, bạn đã quyết định sử dụng tệp thực thi Python nào để chương trình chạy.

virtualenv là để tách biệt các phiên bản và môi trường python, nó đặc biệt tồn tại để loại bỏ xung đột.


Vì vậy, nếu tôi muốn sử dụng python 2.7.3 để chạy một chương trình, tôi sẽ viết: python 2.7.3 main.py?
jesuis

Ngoài ra, về virtualenv: vâng, nhưng nếu virtualenv được thiết lập cho tất cả các phụ thuộc của một phiên bản python và sau đó tôi sử dụng một phiên bản khác để chạy chương trình mà nó chứa, thì sẽ không có khả năng xảy ra xung đột?
jesuis

đọc tài liệu về virtualenvnó có tất cả các chi tiết về vấn đề nó giải quyết.

0

Đối với những người sử dụng pyenv để kiểm soát môi trường ảo của họ, tôi thấy điều này hoạt động trong một tập lệnh:

#!/home/<user>/.pyenv/versions/<virt_name>/bin/python

DO_STUFF

-1

đặt ở đầu các chương trình của tôi, việc sử dụng nó đầy đủ để làm việc với python

import sys

if sys.version_info[0] < 3:
    raise Exception("Python 3 or a more recent version is required.")

Mã này sẽ giúp đầy đủ cho tiến trình


-1

Tôi gặp sự cố này và vừa quyết định đổi tên một trong các chương trình từ python.exe thành python2.7.exe. Bây giờ tôi có thể chỉ định chương trình chạy dễ dàng trên dấu nhắc lệnh mà không cần giới thiệu bất kỳ tập lệnh nào hoặc thay đổi đường dẫn môi trường. Vì vậy, tôi có hai chương trình: python2.7 và python (cái sau là v.3.8 hay còn gọi là mặc định).


-2

Trong khi làm việc với các phiên bản Python khác nhau trên Windows,

Tôi đang sử dụng phương pháp này để chuyển đổi giữa các phiên bản.

Tôi nghĩ nó tốt hơn là làm rối với shebangs và virtualenvs

1) cài đặt phiên bản python bạn muốn

2) chuyển đến Biến môi trường> PATH

(tôi giả sử rằng đường dẫn của các phiên bản python đã được thêm vào Env.Vars.> PATH)

3) ngăn chặn các đường dẫn của tất cả các phiên bản python mà bạn không muốn sử dụng

(không xóa các đường dẫn, chỉ cần thêm một hậu tố như "_sup")

4) gọi python từ thiết bị đầu cuối

(vì vậy Windows sẽ bỏ qua các đường dẫn sai mà bạn đã thay đổi và sẽ tìm thấy python.exe tại đường dẫn bạn không chặn và sẽ sử dụng phiên bản này sau đó)

5) chuyển đổi giữa các phiên bản bằng cách chơi với các hậu tố

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.