Установка Python Script, ведение ссылки на Python 2.6 - PullRequest
3 голосов
/ 10 апреля 2010

Я пытаюсь распространять свою программу на Python. Программа опирается на версию 2.6. Я просмотрел дистрибутивную документацию: http://docs.python.org/distutils/index.html и до сих пор понял, что мне нужно написать скрипт setup.py Что-то вроде:

setup(name='Distutils',
  version='1.0',
  description='Python Distribution Utilities',
  author='My Name',
  author_email='My Email',
  url='some URL',
  package_dir={'': 'src'},
  packages=[''],
 )

Я хотел бы убедиться, что моя программа использует библиотеку интерпретатора 2.6, когда пользователь устанавливает ее на свой компьютер. Как лучше всего убедиться, что моя программа использует 2.6? Должен ли я распространять библиотеку Python 2.6 вместе с моей программой? Есть ли альтернативный подход?

Ответы [ 2 ]

1 голос
/ 10 апреля 2010

Один из вариантов - указать конкретную версию интерпретатора Python с помощью хеш-взрыва:

#! /usr/bin/env python2.6

Другой вариант - проверить sys.version_info , например:

if (sys.version_info[0] != 2) or (sys.version_info[1]<6):
    if sys.version_info[0] > 2:
        print("Version 2.6+, and not 3.0+ needed.")
        sys.exit(1)
    else:
        print "Version 2.6+, needed. Please upgrade Python."
        sys.exit(1)

Хэш-взрыв, вероятно, является наилучшим вариантом, поскольку он фактически гарантирует, что скрипт будет интерпретироваться "python2.6" вместо какого-либо другого интерпретатора; Однако есть некоторые недостатки:

  • Это будет работать только в UNIX-подобных системах, использующих хэш-взрыв.
  • Это не будет работать, если установлен Python2.7, но не Python 2.6.

В качестве обходного пути вы можете создать сценарий Python "launcher", который проверяет наличие "python2.6" ... "python2.9", который является последней возможной версией строки 2.6+ до Python 3.0 +. Этот скрипт запуска может затем вызывать вашу основную программу, используя любой интерпретатор Python, который он найдет в процессе поиска. Вам нужно будет создать скрипт запуска таким образом, чтобы использовать элементы, общие для большинства версий Python.

Заимствование из теста, если исполняемый файл существует в Python :

def which(program):
    import os
    def is_exe(fpath):
        return os.path.exists(fpath) and os.access(fpath, os.X_OK)

    fpath, fname = os.path.split(program)
    if fpath:
        if is_exe(program):
            return program
    else:
        for path in os.environ["PATH"].split(os.pathsep):
            exe_file = os.path.join(path, program)
            if is_exe(exe_file):
                return exe_file

    return None

def first_which(progs):
    for prog in progs:
        progloc = which(prog)
        if progloc != None:
            return progloc
    return None

def main():
    interpreter=first_which(["python2.6","python2.7","python2.8","python2.9"])
    # Invoke your program using "interpreter"
    # You will need to use os.popen or subprocess,
    # depending on the version of Python which which
    # this launcher script was invoked...

Мое собственное мнение состоит в том, что описанный выше метод более сложен, чем необходимо, и я бы просто пошел с хэшем, или я бы записал хэш-файл в файл Python во время развертывания, используя язык, отличный от Python (для которого версия не будет проблемой ... в противном случае это станет рекурсивной проблемой).

Я также настоятельно рекомендую вам НЕ включать копию Python в ваш дистрибутив программного обеспечения. Это сделает вашу загрузку намного больше, и это будет раздражать пользователей, у которых уже есть действующая установка Python. Вместо этого вам следует просто направить пользователей на загрузку и установку соответствующей версии, если она недоступна.

0 голосов
/ 10 апреля 2010

Проверьте sys.hexversion и убедитесь, что оно больше или равно 0x02060000.

...