Вопрос по virtualenv, version, python – Как мне сказать скрипту Python использовать определенную версию

58

Как мне, в модуле main.py (предположительно), сказать Python, какой интерпретатор использовать? Что я имею в виду: если я хочу, чтобы конкретный скрипт использовал версию 3 Python для интерпретации всей программы, как мне это сделать?

Бонус: Как это повлияет на virtualenv? Правильно ли я считаю, что если я создаю virtualenv для своей программы, а затем говорю ей использовать другую версию Python, то я могу столкнуться с некоторыми конфликтами?

Ваш Ответ

5   ответов
35

Возможно, не совсем то, что вы просили, но я считаю, что это полезно поставить в начале моих программ:

import sys

if sys.version_info[0] < 3:
    raise Exception("Python 3 or a more recent version is required.")
Как Ops, я люблю это элегантное решение, чтобы указать, какая версия интерпретатора должна использоваться, без зависимости от какой-либо специфичной для оболочки семантики или переменных окружения.
Именно то, что я искал.
12

Хотя OP может работать на * nix-платформе, этот ответ может помочь не * nix-платформам. Я не сталкивался с подходом Шебанга в Microsoft Windows.

Перефразировано: линия Шебанга отвечает на ваш вопрос о & quot;within my script& Quot; но я верю только для Unix-подобных платформ. Несмотря на то, что оболочка Unix вне сценария фактически интерпретирует строку shebang, чтобы определить, какую версию интерпретатора Python вызывать. Я не уверен, но я считаю, что решение не решает проблему для пользователей платформы Microsoft Windows.

В мире Microsoft Windows упрощенный способ запуска определенной версии Python без настройки переменных среды специально для каждой конкретной установленной версии Python заключается в использовании префиксаpython.exe с путем, который вы хотите запустить, например,C:\Python25\python.exe mymodule.py или жеD:\Python27\python.exe mymodule.py

Однако вам нужно учесть PYTHONPATH и другие переменные окружения PYTHON ..., которые указывают на неправильную версию библиотек Python.

Например, вы можете запустить:C:\Python2.5.2\python.exe mymodule

Тем не менее, переменные среды могут указывать на неправильную версию как таковую:

PYTHONPATH = D:\Python27

PYTHONLIB = D:\Python27\lib

Куча ужасного веселья!

Таким образом, не виртуальный способ, в Windows, будет использовать пакетный файл, который устанавливает среду и вызывает определенный исполняемый файл Python через префиксpython.exe с указанием пути, в котором он находится. Таким образом, у вас есть дополнительные детали, с которыми вам придется работать; например, использование аргументов командной строки для любого из тегов «start» или & quot; cmd.exe & quot; команда "сохранить и заменить" консоль " среда & Quot; если вы хотите, чтобы консоль оставалась после выхода из приложения.

Ваш вопрос заставляет меня думать, что у вас есть несколько модулей Python, каждый из которых ожидает определенную версию Python. Это может быть решено в рамках & quot; скрипт, имеющий модуль запуска, который используетsubprocess модуль. Вместо звонкаmymodule.py вы бы назвали модуль, который вызывает ваш модуль; возможноlaunch_mymodule.py

launch_mymodule.py

import subprocess
if sys.argv[2] == '272':
  env272 = {
    'PYTHONPATH': 'blabla',
    'PYTHONLIB': 'blabla', }
  launch272 = subprocess.Popen('D:\\Python272\\python.exe mymodule.py', env=env272)

if sys.argv[1] == '252'
  env252 = {
    'PYTHONPATH': 'blabla',
    'PYTHONLIB': 'blabla', }
  launch252 = subprocess.Popen('C:\\Python252\\python.exe mymodule.py', env=env252)

Я не проверял это.

Ничего себе, я просто недостаточно умен, чтобы запускать MS-Windows. Это выглядит как тяжелая работа и склонна к ошибкам.
@DevPlayer Отличный и объяснительный скрипт BATCH (по ссылке). Другаяcon в том, что вам действительно нужно написать собственный скрипт python для каждой версии python, для которой вы хотите проверить. Это не то же самое, что OP использования предпочтительной версии сценария python.
Вот пакетный скрипт MS, non-virtualenv, безопасный предварительный запуск Pythonversion check
36

Вы можете вставлять верхнюю строку сценария, но это будет работать только при выполнении в формате ./my_program.py.

Если вы выполняете какpython my_program.pyто какая бы версия Pythonwhich python возвраты будут использованы.

В re: to virtualenv используйте:virtualenv -p /usr/bin/python3.2 или что угодно, чтобы настроить его на использование исполняемого файла Python.

Чтобы завершить этот ответ, возможно, стоило бы описать соответствующий синтаксис «она-взрыв», учитывая, что вопрос сформулирован таким образом, который не подразумевает это знание.
1

Вы не можете сделать это в программе Python, потому что оболочка решает, какую версию использовать, если вы используете строку shebang.

Если вы не используете оболочку с линией Шебанга и просто набираетеpython myprogram.py он использует версию по умолчанию, если вы не решите, какая именно версия Python при вводеpythonXXX myprogram.py какую версию использовать.

Как только ваша Python-программа запущена, вы уже решили, какой исполняемый файл Python использовать для запуска программы.

virtualenv предназначен для разделения версий и сред Python, он специально существует для устранения конфликтов.

Поэтому, если я хочу использовать python 2.7.3 для запуска программы, я бы написал в терминале: python 2.7.3 main.py? jesuis
Я ценю чистоту вашего подхода к программированию: & quot; узнайте сами, прочитав документацию. & Quot; Однако ответ Джона в целом более полезен. Будучи новичком, я даже не был уверен, что такое возможно, поэтому я не хотел тратить кучу времени, если бы мог спросить кого-то из вас более опытных людей. jesuis
читать документацию поvirtualenv в нем есть все детали о том, какую проблему он решает.
Кроме того, о virtualenv: да, но если virtualenv настроен для всех зависимостей одной версии Python, а затем я использую другую для запуска программы, в которой она находится, разве не будет возможности конфликтов? jesuis
14

Я бы использовал Шебанг#!/usr/bin/python (первая строка кода) с серийным номером Python в конце;)

То же самое, если вы хотите запустить Python из командной строки Linux.

Не то, чтобы была какая-то причина специально указывать 2.7.3 - все 2.X должны быть в основном совместимы и 2.7.X полностью.
@MikeHalpin посмотрите, что находится в вашем / usr / bin. Вам нужно сослаться на существующий исполняемый файл. Если у вас установлен 2.7.3, то я считаю, что вы будете правы.
Обратите внимание, что это не сработает, если вы запустите скрипт, как обычно, когда вы запускаете скрипт на Python, то есть запустивpython <python-file> сформировать терминал.
да, так как python2.7 filename.py для всех / любых версий python 2.7.x
Итак, если бы я хотел Python 2.7.3, я бы использовал #! / Usr / bin / python2.7.3 jesuis

Похожие вопросы