может ли один скрипт python работать как с python 2.x, так и с python 3.x

У меня есть тысячи серверов (linux), у некоторых есть только python 2.x, а у некоторых только python 3.x, я хочу написать один скрипт. check.py можно запускать на всех серверах так же, как $. / check.py без использования $ python check.py или $ python3 check.py, есть ли способ сделать это?

мой вопрос в том, как скрипт check.py находит интерпретатор независимо от того, что интерпретатором является python2.x и python3.x

2 Solutions collect form web for “может ли один скрипт python работать как с python 2.x, так и с python 3.x”

Многие скрипты могут работать как на 2.x, так и на 3.x. (У меня есть куча, над которым я работаю ежедневно, и я конвертировал различные библиотеки с открытым исходным кодом из 2.x только в двойную версию).

Несколько вещей делают это намного проще:

  • Требование 2.7 или минимум 2.6+ для пользователей 2.x. В противном случае, например, вы не можете поднимать и исключать с параметрами или перехватывать их в переменные и другие такие серьезные ограничения.
  • Требовать 3,3 + или, по крайней мере, 3.2+, для пользователей 3.x. Большая часть безнадежных несовместимостей (например, от префикса u ) была отменена в 3.2 или 3.3.
  • Используйте шесть библиотек.
  • Используйте инструкции __future__ .
  • Всегда будьте в курсе, имеете ли вы в виду bytes (всегда 8-битные), unicode (необходимо кодировать, если вы хотите 8-разрядный), или str (независимо от того, что ожидает большинство API-интерфейсов stdlib), и encode и decode мере необходимости.
  • Регулярно запускайте 2to3 на свой код. (Но не слепо делать все, что он говорит. Если, например, вы используете d.keys() или map(f, l) потому что вам все равно, верните ли вы list или нет, вы получите предупреждение, потому что 2to3 не знает, что вам все равно.)

В качестве альтернативы вместо того, чтобы пытаться писать код, который выполняется на обоих, напишите код, который выполняется на 2.x, но может быть автоматически преобразован 2to3 в запущенный код 3.x и сделать эту часть процесса установки (в setup.py , if sys.version_info >= (3, 0): выполните шаг 2to3 ).

Из вашего редактирования это звучит так, будто вы в основном озабочены тем, что нужно положить в #! линия. Для этого:

 /usr/bin/env python 

Это не гарантирует работу, но тогда env не гарантирует работу на первом месте … Вы можете рассчитывать на то, что:

  • Почти на любой системе, где платформа / дистрибутив обеспечивает только 2.x, python – это Python 2.
  • Почти на любой системе, где платформа / дистрибутив поставляет оба, python – это Python 2.
  • Почти на любой системе, где платформа / дистрибутив поставляет только 3.x (которая в настоящее время очень редка, но, по-видимому, в конечном итоге будет более распространена), python – это Python 3.

Однако:

  • В системе, где платформа не предоставляет ни одного , если администратор установил только 3.x, он, скорее всего, (начиная с начала 2013 года) не будет доступен как python . Ты мало что можешь сделать с этим.

Если последняя является серьезной проблемой, вы можете обойти ее, добавив сценарий запуска, написанный в sh, который пытается python а затем пытается python3 если это не удается.

Хороший способ сделать это – указать скрипт launcher как интерпретатор shebang в вашем скрипте Python. Linux может справиться с этим, но он настраивается, и по крайней мере некоторые дистрибутивы отключают его по умолчанию, и большинство других систем nix не могут этого сделать.

Если это не сработает, следующий лучший вариант – заставить пользователя запустить сценарий запуска, то есть сказать им сделать ./check.sh вместо ./check.py , а check.sh правильный Python интерпретатор и запускает $python ./check.py для пользователя.

Если вы хотите стать очень хитрым, вы можете даже встроить скрипт Python в качестве heredoc внутри сценария оболочки, поэтому вам нужно всего лишь распределить один файл. Они запускаются ./check.sh , и он находит правильный Python и запускает его на heredoc.

Учитывая, что Python 3.x не полностью обратно совместим с Python 2.x, вы должны убедиться, что сценарий совместим с обеими версиями. Это может быть сделано с некоторой помощью от инструмента 2to3 , но в конечном итоге может означать запуск двух разных сценариев Python.

  • Не удается запустить Python из строки cmd
  • Работа с конфликтом имени модуля
  • Скребок: как переформатировать сбор и вывод данных csv
  • По умолчанию и выберите первый элемент в списке Tkinter
  • struct.unpack, вызывающий TypeError: 'int' не поддерживает буферный интерфейс
  • Преобразование Python 3 ResourceWarnings в исключение
  • python для цикла увеличивается или уменьшается
  • Как удалить содержимое файла перед записью в него в сценарии python?
  • Python - лучший язык программирования в мире.