Як сказати сценарію Python використовувати певну версію


78

Як мені в модулі main.py (імовірно) сказати Python, який інтерпретатор використовувати? Я маю на увазі: якщо я хочу, щоб певний сценарій використовував версію 3 Python для інтерпретації всієї програми, як це зробити?

Бонус: Як це вплине на virtualenv? Я не помиляюсь, думаючи, що якщо я створим virtualenv для своєї програми, а потім скажу їй використовувати іншу версію Python, то я можу зіткнутися з деякими конфліктами?

Відповіді:


56

Ви можете додати рядок shebang у верхню частину сценарію:

#!/usr/bin/env python2.7

Але це буде працювати лише під час виконання як ./my_program.py.

Якщо виконати як python my_program.py, тоді буде використана будь-яка версія Python, яка which pythonповертається.

In re: to virtualenv use: virtualenv -p /usr/bin/python3.2або що завгодно, щоб налаштувати його на використання цього виконуваного файлу Python.


10
Щоб зробити цю відповідь повною, можливо, варто було б описати відповідний синтаксис, коли вона задається, враховуючи, що запитання сформульоване таким чином, що не передбачає цих знань.
JBentley

Що робити, якщо шлях для шебанга занадто довгий? Він дозволяє всього 128 символів. Чи слід встановлювати псевдонім для python у деяких install.py?
Лукас

Чи можу я це якось налагодити? У мене це не працює, і я не розумію, чому ... Це теж працює на вікнах? Здається, синтаксис Unix ...
Брамбор

56

Можливо, не зовсім те, що ви просили, але я вважаю, що це було б корисно поставити на початку моїх програм:

import sys

if sys.version_info[0] < 3:
    raise Exception("Python 3 or a more recent version is required.")

Чи не є виклик функції стилю дужок новим для python3? Чи працює цей код належним чином у всіх версіях python?
TamaMcGlinn

1
@TamaMcGlinn Не впевнений, що саме ви маєте на увазі під цим; [0] означає, що він посилається на перший запис у масиві (що в цьому випадку означає першу цифру версії Python, наприклад, у 2.7.3 це буде 2), не роблячи виклику функції. AFAIK це працює у всіх версіях Python.
Гравітаційна могила

Причиною того, що я дізнався про різницю між python2 та python3, є спроба зробити print "hello world"компіляцію. Я думаю, що змінилася лише сама заява на друк, звідси моя плутанина. Дякуємо за пояснення, що це працює у всіх версіях Python, оскільки це важливо.
TamaMcGlinn

21

Я б використав shebang #!/usr/bin/python (перший рядок коду) із серійним номером Python в кінці;)

Потім запустіть файл Python як скрипт, наприклад, ./main.pyз командного рядка, а не python main.py.

Те саме, коли ви хочете запустити Python з командного рядка Linux.


7
Отже, якби я хотів python 2.7.3, я б використовував #! /
Usr

@MikeHalpin подивіться, що є у вашому / usr / bin. Вам потрібно посилатися на існуючий виконуваний файл. Якщо у вас встановлено 2.7.3, то, я вважаю, ви були б правильно.
Ендофаг

Немає жодної причини, щоб конкретно вказати 2.7.3 - усі 2.X мають бути переважно сумісними та 2.7.X повністю.
Ерік,

так, так як python2.7 filename.py для всіх / будь-яких версій python 2.7.x
geekidharsh

2
Зауважте, що це не спрацює, якщо ви виконуєте сценарій, як зазвичай, коли запускаєте скрипт python, тобто запускаючи python <python-file>форму з терміналу.
HelloGoodbye

14

Хоча ОП може працювати на платформі nix, ця відповідь може допомогти ненікс-платформам. Я не відчував роботи підходу shebang в Microsoft Windows.

Перефразовано: рядок shebang відповідає на ваше запитання " у моєму сценарії ", але я вважаю, що це лише для 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

Проте змінні середовища можуть вказувати на неправильну версію як таку:

ПІФОНПАТ = D: \ Python27

PYTHONLIB = D: \ Python27 \ lib

Безліч жахливих розваг!

Отже, невіртуальним способом у Windows було б використання командного файлу, який встановлює середовище та викликає певний виконуваний файл Python, додаючи префікс python.exe до шляху, в якому він знаходиться. Таким чином, ви отримаєте додаткові дані хоч управляти; наприклад, використання аргументів командного рядка для команди "start" або "cmd.exe" для "збереження та заміни середовища" консолі ", якщо ви хочете, щоб консоль залишалася після виходу програми.

Ваше запитання змушує мене думати, що у вас є кілька модулів Python, кожен з яких очікує певної версії Python. Це може бути вирішене "всередині" сценарію за допомогою модуля запуску, який використовує модуль підпроцесу . Замість виклику mymodule.py ви зателефонуєте модулю, який викликає ваш модуль; можливо, launch_mymodule.py

launch_mymodule.py

import sys
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)

Я не тестував цього.


1
Ось пакетний скрипт MS, не-virtualenv, безпечна перевірка версії
DevPlayer

@DevPlayer Відмінний та пояснювальний сценарій BATCH (за посиланням). Іншим conє те, що ви насправді повинні писати власний сценарій python для кожної версії python, для якої ви хочете протестувати. Це не те саме, що OP використання переважної версії python сценарію.
Jesse Chisholm

0

Ви не можете цього зробити в програмі Python, оскільки оболонка вирішує, яку версію використовувати, якщо ви маєте рядок shebang.

Якщо ви не використовуєте оболонку з рядком shebang, а просто набираєте python myprogram.pyїї, використовується версія за замовчуванням, якщо ви не вирішите конкретно, яку версію Python, коли ви вводите, pythonXXX myprogram.pyяку версію використовувати.

Після запуску програми Python ви вже вирішили, який виконуваний файл Python використовувати для запуску програми.

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


Отже, якщо я хочу використовувати python 2.7.3 для запуску програми, я б у терміналі писав: python 2.7.3 main.py?
Jesuis

Крім того, про virtualenv: так, але якщо virtualenv налаштований на всі залежності однієї версії python, а потім я використовую іншу для запуску програми, в якій він знаходиться, чи не буде можливості конфліктів?
Jesuis

прочитайте документацію, на virtualenvякій є всі подробиці про те, яку проблему він вирішує.

0

Для тих, хто використовує pyenv для управління своїм віртуальним середовищем, я виявив, що це працює в сценарії:

#!/home/<user>/.pyenv/versions/<virt_name>/bin/python

DO_STUFF

-1

поклав на початку моїх програм його повне використання для роботи з python

import sys

if sys.version_info[0] < 3:
    raise Exception("Python 3 or a more recent version is required.")

Цей код допоможе повною мірою досягти успіху


-1

У мене була ця проблема, і я просто вирішив перейменувати одну з програм з python.exe на python2.7.exe. Тепер я можу вказати в командному рядку, яку програму легко запускати, не вводячи скриптів і не змінюючи шляхи середовища. Отже, у мене є дві програми: python2.7 і python (остання, яка за замовчуванням є v.3.8).


-2

Під час роботи з різними версіями Python в Windows,

Я використовую цей метод для перемикання між версіями.

Я думаю, що це краще, ніж возитися з шебангами та віртуалами

1) встановіть потрібні версії python

2) перейдіть до змінних середовища> PATH

(я припускаю, що шляхи версій python вже додані до Env.Vars.> PATH)

3) придушити шляхи всіх версій python, які ви не хочете використовувати

(не видаляйте контури, просто додайте суфікс типу "_sup")

4) викликати python з терміналу

(тому Windows пропустить неправильні шляхи, які ви змінили, і знайде python.exe за тим шляхом, який ви не пригнічували, і використовуватиме цю версію після увімкнення)

5) перемикатися між версіями, граючи із суфіксами

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.