python == python2 АБО python == python3? Як упакувати, розповсюджувати сценарії python py2k?


10

Залежно від системи, python== python2або python== python3.

Виконувані сценарії Python починаються з:

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

Для python py3k це передбачено в документації, я повинен / можу використовувати його з номером версії , тому я роблю це:

#!/usr/bin/env python3

Але я знайшов проблему зі сценаріями py2k.

У той час як в py2k документації написано використовувати: #! /usr/bin/env python,

на деяких * nix-es python py3k за замовчуванням, тому python == python3. (Наприклад, пакет пакунків ArchLinux python , тут файли пакунків python ).

Як упакувати (налаштувати, зробити) та / або підготувати сценарії python для розповсюдження для цього?

Я запитую про створення програмних пакетів, які користувачі можуть легко запускати (без модифікації свого середовища)

Чи можу я зробити такий же трюк для скриптів python py2k, як і для скриптів python py3k, і встановити його як #!/usr/bin/env python2:? Чи можу я бути впевнений, що кожен дистрибутив python py2k містить python2файл, так #!/usr/bin/env python2буде працювати?

Якщо так, то чому це не пропонується як стандарт, наприклад, у документації python py2k ?


4
Наскільки я знаю, ви завжди можете використовувати його python2для запуску (якщо він встановлений), і завжди ви можете перевірити версію python -V. якщо ви хочете, щоб pythonце було 2 або 3, вам слід rm /usr/bin/pythonстворити символьне посилання, яке вказує на вашу версію пізерного пітону, наприклад ln -s /usr/bin/python2.5 /usr/bin/python.
Ханан Н.

Дякуємо, що забезпечили мене python2. Цікаво, чому це не стандартно використовувати його, коли є py2k і py3k і за замовчуванням pythonможуть відрізнятися. Що стосується ваших порад щодо вилучення - це не правильно для цього прикладу, тому що я запитую про упаковку. Я хотів би зробити пакет, який може працювати в різних конфігураціях / системах. Ні в якому разі щодо зміни середовища. Що щодо перевірки - це не стосується Shebang - наскільки я знаю.
Grzegorz Wierzowiecki

Я вважаю, що @Hanan N. намагається сказати вам, що якщо ви пишете код Python 2.x, то використовуйте #!...python2у своїх програмах, а якщо ви використовуєте Python 3.x, то використовуйте #!...python3. Не покладайтеся на те, що операційна система матиме правильне посилання, якщо ви знаєте, що вона працюватиме лише в певному випуску. Я працюю з системами, на яких ще встановлено Python 1.5.2 як /usr/bin/python- я або пишу код для обробки старих версій Python, або використовую python2.
Арседж

2
@Arcege У мене немає python2виконуваного файлу в моїй системі (видавлювання Debian). pythonє символьним посиланням на python2.6, і python3є символьним посиланням на python3.1, але його немає python2.
Жил 'ТАК - перестань бути злим'

Відповіді:


3

Сценарій може перевірити його версію Python і, якщо це Python 3, перезапустити себе за допомогою Python 2. Додайте наступне біля голови сценарію:

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__))

Для цього використовується команда системи whichдля пошуку python2в середовищі PATH. Потім він знову відновлюється з цим (або перериває, якщо не в змозі його знайти).

Зауважте, що для запуску в Python 3 для скрипту потрібно мати дійсний синтаксис Python 3.

Крім того, будь-який вихід повинен бути очищений перед execvвикликом або він буде втрачений. Наприклад, додавання, sys.stdout.flush()безпосередньо перед викликом до, execvбуде вимивати будь-які printзаяви.


1

У старих версіях їх може бути просто pythonзамість python2. Щоб ваша лінія sheebang була більш чіткою, ви можете створити посилання, python2 -> pythonщоб ви могли використовувати її #!/usr/bin/env python2.


Однак це не вирішує заявлену проблему. Оскільки питання полягає в тому, як зробити свій скрипт достатньо портативним, щоб він міг працювати у всіх згаданих середовищах (з "python" "python2" тощо)
Grzegorz Wierzowiecki

1

Я думаю, що "стандарт" визначений у https://www.python.org/dev/peps/pep-0394/

Цей PEP надає умову, щоб гарантувати, що сценарії Python можуть продовжувати переноситися через * nix системи, незалежно від версії інтерпретатора Python за замовчуванням (тобто версії, на яку посилається команда python).

  • python2 буде посилатися на деяку версію Python 2.x.
  • python3 буде посилатися на деяку версію Python 3.x.
  • на даний момент усі дистрибутиви повинні гарантувати, що python посилається на ту саму ціль, що й python2.
  • однак кінцеві користувачі повинні знати, що python посилається на python3 хоча б на Arch Linux (саме ця зміна спонукала до створення цього PEP), тому python слід використовувати в рядку shebang лише для сценаріїв, які є джерелом, сумісним з обома Python 2 і 3.
  • готуючись до можливої ​​зміни версії Python за замовчуванням, лише сценарії Python 2 повинні бути або оновлені, щоб бути джерелом, сумісним з Python 3, або ж використовувати python2 у рядку shebang.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.