2008-09-02 12 views
12

В начале всех моих сценариев исполняемого Python Я поставили shebang строки:развертывание Python и/USR/бен/окр портативность

#!/usr/bin/env python 

Я бег этих сценариев в системе, где env python дает Python 2.2 Окружающая среда. Мои сценарии быстро выходят из строя, потому что у меня есть ручная проверка для совместимой версии с Python:

if sys.version_info < (2, 4): 
    raise ImportError("Cannot run with Python version < 2.4") 

Я не хочу, чтобы изменить притон линию на каждом исполняемом файл, если это возможно; Однако, я не административный доступ к машине, чтобы изменить результат env python, и я не хочу, чтобы заставить конкретную версию, как:

#!/usr/bin/env python2.4 

Я хотел бы избежать этого, потому что система может имеют более новую версию, чем Python 2.4, или могут иметь Python 2.5, но не Python 2.4.

Какое изящное решение?

[Edit:] Я не был достаточно конкретной постановкой вопроса - я хотел бы, чтобы пользователи могли выполнять сценарии без ручной настройки (например, путь изменения или символических ссылок в ~/bin и обеспечении вашей PATH имеют ~/bin перед Python 2.2). Может быть, какая-то утилита распределения необходима для предотвращения ручных настроек?

ответ

8

«env» просто выполняет первое, что находит в PATH env var. Чтобы переключиться на другой python, добавьте каталог для исполняемого файла python в путь до вызова вашего скрипта.

2

Если вы работаете в сценарии, то вы можете установить переменную PATH, чтобы указать на частный бен каталог первой:

$ mkdir ~/bin 
$ ln -s `which python2.4` ~/bin/python 
$ export PATH=~/bin:$PATH 

Затем, когда вы выполняете свой питон скрипт, он будет использовать Python 2.4. Вам нужно будет изменить свои сценарии входа, чтобы изменить PATH.

В качестве альтернативы запустить питон скрипт с явным переводчиком вы хотите:

$ /path/to/python2.4 <your script> 
4

Довольно хак решения - если ваша проверка терпит неудачу, используйте эту функцию (которая, вероятно, может быть значительно улучшены), чтобы определить лучший переводчик доступен, определить, приемлемо ли это, и, если это так, перезапустите скрипт с помощью os.system или что-то подобное и ваш sys.argv с помощью нового интерпретатора.

import os 
import glob 
def best_python(): 
    plist = [] 
    for i in os.getenv("PATH").split(":"): 
     for j in glob.glob(os.path.join(i, "python2.[0-9]")): 
      plist.append(os.path.join(i, j)) 
    plist.sort() 
    plist.reverse() 
    if len(plist) == 0: return None 
    return plist[0] 
+0

Плюс, предположим, что он использует os.exec с найденным исполняемым файлом и списком sys.argv. – tzot 2008-09-25 09:39:55

0

@morais: Это интересная идея, но я думаю, что мы можем сделать это на шаг дальше. Может быть, есть способ использовать Ian Bicking's virtualenv:

  • Посмотрите, если мы работаем в приемлемой среде для начала, и если да, ничего не делайте.
  • Проверьте, существует ли исполняемый файл, специфичный для версии, на PATH, то есть проверьте, существует ли python2.xfor x in reverse(range(4, 10)). Если это так, запустите команду с лучшим интерпретатором.
  • Если лучшего интерпретатора нет, используйте virtualenv, чтобы попытаться установить более новую версию Python из старой версии Python и получить любые необходимые пакеты.

Я понятия не имею, способен ли virtualenv к этому, поэтому я скоро приду к нему. :)

+0

Если вы находитесь в Windows, некоторые из описанных вами логик доступны из [PEP 397 Python launcher for Windows] (http://www.python.org/dev/peps/pep-0397/) – 2012-09-28 18:46:06

0

Вот решение, если вы (1) абсолютно настроены на использование shebangs и (2) можете использовать Autotools в процессе сборки.

Я только что нашел вчера вечером, что вы можете использовать макрос autoconf AM_PATH_PYTHON, чтобы найти минимальный Python двоичный код. Практическое руководство: here.

Таким образом, ваш процесс будет:

  • выдавать AM_PATH_PYTHON(2.4) в вашем configure.ac
  • переименовывать все ваши .py скриптов .py.in (по моему опыту, это не смущает vi)
  • Имя все те сценарии Python, которые вы хотите сгенерировать с помощью AC_CONFIG_FILES.
  • Вместо того чтобы начать с #!/usr/bin/env python используйте #[email protected]@

Тогда ваши результирующих скриптов Python всегда будут иметь соответствующую хижину.

Итак, у вас есть это решение, по крайней мере, возможно, если оно не практично.