Я знаходжуся в цікавій ситуації, коли у мене є сценарій Python, який теоретично може управляти різними користувачами в різних середовищах (і PATH) і в різних системах Linux. Я хочу, щоб цей сценарій виконувався на якомога більше таких без штучних обмежень. Ось кілька відомих налаштувань:
- Python 2.6 - це системна версія Python, тому python, python2 та python2.6 всі існують у / usr / bin (і є еквівалентними).
- Python 2.6 - це системна версія Python, як було зазначено вище, але Python 2.7 встановлений поряд з нею як python2.7.
- Python 2.4 - це системна версія Python, яку мій сценарій не підтримує. У / usr / bin у нас є python, python2 та python2.4, які еквівалентні, та python2.5, який підтримує сценарій.
Я хочу запустити один і той же виконуваний скрипт python на всіх трьох. Було б добре, якби він спробував спочатку скористатись /usr/bin/python2.7, якщо він існує, потім повернутися до /usr/bin/python2.6, потім повернутися до /usr/bin/python2.5, потім просто помиліться, якщо жодного з них не було. Я не надто зациклювався на цьому, використовуючи найсвіжіший 2.x можливий варіант, хоча, поки він зможе знайти одного з правильних перекладачів, якщо він присутній.
Першим моїм нахилом було змінити лінію shebang з:
#!/usr/bin/python
до
#!/usr/bin/python2.[5-7]
так як це добре працює в баш. Але запуск сценарію дає:
/usr/bin/python2.[5-7]: bad interpreter: No such file or directory
Гаразд, тому я спробую наступне, що також працює в bash:
#!/bin/bash -c /usr/bin/python2.[5-7]
Але знову ж таки, це не вдається:
/bin/bash: - : invalid option
Гаразд, очевидно, що я міг просто написати окремий скрипт оболонки, який знаходить правильний інтерпретатор і запускає скрипт python, використовуючи будь-який інтерпретатор, який він знайшов. Я просто знайшов би клопотання розповсюджувати два файли, де одного вистачить, доки він запущений із встановленим найсучаснішим інтерпретатором python 2. Попросити людей чітко викликати перекладача (наприклад, $ python2.5 script.py
) - це не варіант. Покладатися на налаштування PATH користувача певним чином також не є варіантом.
Редагувати:
Перевірка версій у скрипті Python не буде працювати, оскільки я використовую оператор "з", який існує на Python 2.6 (і може використовуватися в 2.5 зfrom __future__ import with_statement
). Це призводить до негайного відмови сценарію із непривітним для користувача SyntaxError, і заважає мені коли-небудь мати можливість перевірити версію спочатку та видати відповідну помилку.
Приклад: (спробуйте це з інтерпретатором Python менше 2,6)
#!/usr/bin/env python
import sys
print "You'll never see this!"
sys.exit()
with open('/dev/null', 'w') as out:
out.write('something')
./script.py
) призведе до його виконання python2.4, що призведе до того, що ваш код виявить, що він був неправильною версією (і вийшов, імовірно). Але є ідеально хороший python2.5, який міг бути використаний як інтерпретатор!
exec
якщо так, то в іншому випадку надрукуйте помилку.
execve
). Аргументи - це рядкові літерали, ні глобалізація, ні регулярні виразки. Це воно. Навіть якщо перший аргумент - "/ bin / bash", а другий параметр ("-c ..."), ці параметри не розбираються оболонкою. Вони передаються без обробки до виконуваного файлу bash, саме тому ви отримуєте ці помилки. Плюс до всього, шебанг працює лише в тому випадку, якщо він знаходиться на початку. Отож, я боюсь, що вам тут не пощастило (окрім сценарію, який знаходить інтерпретатора пітону та подає його ТУТ, що звучить як жахливий безлад).
import sys; sys.version_info()
перевірити, чи є у користувача необхідну версію python.