В зависимости от системы, 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 ?
источник
python2
для запуска (если он установлен), и всегда вы можете проверить версию сpython -V
. если вы хотите, чтобыpython
это было 2 или 3, вы должныrm /usr/bin/python
и затем создать символическую ссылку, которая указывает на вашу версию Python, напримерln -s /usr/bin/python2.5 /usr/bin/python
.python2
. Интересно, почему это не стандартно использовать, когда есть py2k и py3k и по умолчаниюpython
может отличаться. Как насчет вашего совета по удалению - это не соответствует этому примеру, потому что я спрашиваю об упаковке. Я хотел бы сделать пакет, который может работать в разных конфигурациях / системах. Нет способа изменить среду. Что касается проверки - это не относится к Шебангу - насколько я знаю.#!...python2
в своих программах, а если вы используете Python 3.x, используйте#!...python3
. Не полагайтесь на правильную ссылку в операционной системе, если вы знаете, что она будет работать только для определенного выпуска. Я работаю с системами, в которых все еще установлен Python 1.5.2/usr/bin/python
- я либо пишу код для обработки старых версий Python, либо использую егоpython2
.python2
исполняемого файла в моей системе (Debian squeeze).python
является символической ссылкой наpython2.6
, иpython3
является символической ссылкой наpython3.1
, но нетpython2
.Ответы:
Сценарий может проверить свою версию Python и, если это Python 3, перезапустить себя, используя Python 2. Добавьте следующую строку в начало сценария:
Это использует системную
which
команду для определения местоположенияpython2
в средеPATH
. Затем он перезапускается с этим (или прерывается, если не может его найти).Обратите внимание, что скрипт должен быть действительным синтаксисом Python 3 для запуска в Python 3.
Кроме того, любой выход должен быть сброшен перед
execv
вызовом, иначе он будет потерян. Например, добавлениеsys.stdout.flush()
непосредственно перед вызовомexecv
сбрасывает любыеprint
операторы.источник
На старых версиях может быть просто
python
вместоpython2
. Чтобы сделать вашу линию более понятной, вы можете создать ссылку, которуюpython2 -> python
вы можете использовать#!/usr/bin/env python2
.источник
Я думаю, что «стандарт» определен в https://www.python.org/dev/peps/pep-0394/
источник