python == python2 HOẶC python == python3? Làm thế nào để đóng gói, phân phối kịch bản py2k python?


10

Tùy thuộc vào hệ thống, python== python2hoặc python== python3.

Các tập lệnh Python có thể thực thi, bắt đầu bằng:

#!/usr/bin/env python
#!/usr/bin/env python2
#!/usr/bin/env python3...

Đối với python py3k, nó được cung cấp trong tài liệu Tôi nên / có thể sử dụng nó với số phiên bản , vì vậy tôi làm điều này:

#!/usr/bin/env python3

Nhưng tôi đã tìm thấy một vấn đề với các kịch bản py2k.

Trong khi trong tài liệu py2k, nó được viết để sử dụng : #! /usr/bin/env python,

trên một số * nix-es python py3k là mặc định, vì vậy python == python3. (Ví dụ gói python ArchLinux , ở đây tập tin gói python ).

Làm cách nào để đóng gói (cấu hình, thực hiện) và / hoặc chuẩn bị các tập lệnh python để phân phối để xử lý việc đó?

Tôi hỏi về việc tạo các gói phần mềm có thể chạy dễ dàng bởi người dùng (mà không cần sửa đổi môi trường của họ)

Tôi có thể thực hiện thủ thuật tương tự cho các kịch bản py2k python như đối với các kịch bản py3k python và đặt nó là : #!/usr/bin/env python2? Tôi có thể chắc chắn rằng mỗi bản phân phối py2k python chứa python2tệp, vì vậy #!/usr/bin/env python2sẽ hoạt động?

Nếu có, tại sao nó không được đề xuất như là tiêu chuẩn, ví dụ trong tài liệu py2k python ?


4
Theo như tôi biết, bạn luôn có thể sử dụng python2để chạy nó (nếu đã cài đặt) và luôn luôn bạn có thể kiểm tra phiên bản python -V. nếu bạn muốn đó pythonlà 2 hoặc 3, thì bạn nên rm /usr/bin/pythontạo liên kết tượng trưng từ phiên bản python desierd của bạn, vd ln -s /usr/bin/python2.5 /usr/bin/python.
Hanan N.

Cảm ơn đã đảm bảo cho tôi về python2. Tôi tự hỏi tại sao nó không chuẩn để sử dụng nó khi có py2k và py3k và mặc định pythoncó thể khác nhau. Điều gì về lời khuyên của bạn về việc loại bỏ - nó không phù hợp với ví dụ này, vì tôi hỏi về bao bì. Tôi muốn tạo gói có thể chạy trong các cấu hình / hệ thống khác nhau. Không có cách nào để sửa đổi môi trường. Điều gì về kiểm tra - nó không áp dụng cho Shebang - theo như tôi biết.
Grzegorz Wierzowiecki

Tôi tin rằng điều mà @Hanan N. đang cố nói với bạn là nếu bạn đang viết mã Python 2.x, thì hãy sử dụng #!...python2trong các chương trình của bạn và nếu bạn đang sử dụng Python 3.x, thì hãy sử dụng #!...python3. Đừng dựa vào hệ điều hành để có liên kết phù hợp nếu bạn biết nó sẽ chỉ hoạt động trên một bản phát hành cụ thể. Tôi làm việc với các hệ thống vẫn cài đặt Python 1.5.2 như /usr/bin/python- Tôi viết mã để xử lý các bản phát hành Python cũ hơn hoặc sử dụng python2.
Arcege

2
@Arcege Tôi không có python2khả năng thực thi trên hệ thống của mình (Debian nén). pythonlà một liên kết tượng trưng đến python2.6python3là một liên kết tượng trưng đến python3.1, nhưng không có python2.
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


3

Một tập lệnh có thể kiểm tra phiên bản Python của nó và, nếu đó là Python 3, hãy tự khởi động lại bằng Python 2. Thêm phần sau vào gần phần đầu của tập lệnh:

if sys.version > '3':
  python2 = os.popen('which python2 2> /dev/null').read().rstrip()
  if python2:
    args = sys.argv[:]
    args.insert(0,python2)
    os.execv(python2,args)
  else:
    sys.exit("%s requires Python Version 2 (python2 not in PATH)" % os.path.basename(__file__))

Điều này sử dụng whichlệnh của hệ thống để xác định vị trí python2trong môi trường PATH. Sau đó, nó tự khởi động lại với điều đó (hoặc hủy bỏ nếu không thể tìm thấy nó).

Lưu ý rằng tập lệnh cần phải là cú pháp Python 3 hợp lệ để nó bắt đầu trong Python 3.

Ngoài ra, bất kỳ đầu ra nên được xóa trước khi execvcuộc gọi hoặc nó sẽ bị mất. Thêm vào, ví dụ, sys.stdout.flush()ngay trước cuộc gọi execvsẽ xóa bất kỳ printcâu lệnh nào .


1

Trên các phiên bản cũ hơn, có thể chỉ có pythonthay vì python2. Để làm cho dòng sheebang của bạn rõ ràng hơn, bạn có thể tạo một liên kết python2 -> pythonđể bạn có thể sử dụng #!/usr/bin/env python2.


Tuy nhiên, nó không giải quyết được vấn đề đã nêu. Bởi vì câu hỏi là làm thế nào để tập lệnh của bạn đủ di động, để nó có thể chạy trong tất cả các môi trường được đề cập (với "python" "python2", v.v.)
Grzegorz Wierzowiecki

1

Tôi nghĩ rằng "tiêu chuẩn" được xác định trong https://www.python.org/dev/peps/pep-0394/

PEP này cung cấp một quy ước để đảm bảo rằng các tập lệnh Python có thể tiếp tục được di động trên các hệ thống * nix, bất kể phiên bản mặc định của trình thông dịch Python (tức là phiên bản được gọi bởi lệnh python).

  • python2 sẽ đề cập đến một số phiên bản của Python 2.x.
  • python3 sẽ đề cập đến một số phiên bản của Python 3.x.
  • trong thời điểm hiện tại, tất cả các bản phân phối phải đảm bảo rằng python đề cập đến cùng một mục tiêu là python2.
  • tuy nhiên, người dùng cuối nên biết rằng python đề cập đến python3 trên ít nhất là Arch Linux (sự thay đổi đó đã thúc đẩy việc tạo PEP này), vì vậy python chỉ nên được sử dụng trong dòng shebang cho các tập lệnh tương thích với cả Python 2 và 3.
  • để chuẩn bị cho một sự thay đổi cuối cùng trong phiên bản mặc định của Python, các tập lệnh chỉ dành cho Python 2 phải được cập nhật để tương thích nguồn với Python 3 hoặc sử dụng python2 trong dòng shebang.
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.