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. (Например, пакет Python ArchLinux , здесь файлы пакета Python ).

Как упаковать (настроить, сделать) и / или подготовить сценарии Python для распространения, чтобы справиться с этим?

Я спрашиваю о создании пакетов программного обеспечения, которые могут легко запускаться пользователями (без изменения их среды)

Могу ли я сделать то же трюк для питона py2k сценариев , как для питона 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и затем создать символическую ссылку, которая указывает на вашу версию Python, например ln -s /usr/bin/python2.5 /usr/bin/python.
Ханан Н.
Спасибо за предоставление мне о python2. Интересно, почему это не стандартно использовать, когда есть py2k и py3k и по умолчанию pythonможет отличаться. Как насчет вашего совета по удалению - это не соответствует этому примеру, потому что я спрашиваю об упаковке. Я хотел бы сделать пакет, который может работать в разных конфигурациях / системах. Нет способа изменить среду. Что касается проверки - это не относится к Шебангу - насколько я знаю.
Гжегож Вежовецкий
Я верю, что @Hanan N. пытается сказать вам, что если вы пишете код Python 2.x, используйте его #!...python2в своих программах, а если вы используете Python 3.x, используйте #!...python3. Не полагайтесь на правильную ссылку в операционной системе, если вы знаете, что она будет работать только для определенного выпуска. Я работаю с системами, в которых все еще установлен Python 1.5.2 /usr/bin/python- я либо пишу код для обработки старых версий Python, либо использую его python2.
Arcege
2
@ Arcege У меня нет python2исполняемого файла в моей системе (Debian squeeze). 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операторы.

starfry
источник
1

На старых версиях может быть просто pythonвместо python2. Чтобы сделать вашу линию более понятной, вы можете создать ссылку, которую python2 -> pythonвы можете использовать #!/usr/bin/env python2.

DocSalvager
источник
Однако это не решает заявленную проблему. Потому что вопрос в том, как сделать ваш скрипт достаточно переносимым, чтобы он мог работать во всех упомянутых средах (с «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.
StrongBad
источник