Могу ли я иметь две линии Шебанга, одну для python и одну для python3? - PullRequest
3 голосов
/ 15 марта 2020

У меня есть скрипт, который я запускаю на нескольких Linux ОС. Строка shebang моего сценария:

#!/usr/bin/python

Когда я наткнулся на CentOS 8, это не сработало, так как я получил следующее: "- bash: ./sysinfo -snapshot.py: / usr / bin / python: плохой интерпретатор: нет такого файла или каталога "

И в качестве обходного пути я могу изменить строку shebang на

#!/usr/bin/python3

и это решило бы проблему на 100%.

Однако мне нужно, чтобы мой скрипт попробовал первую строку shebang, а если он не сработал, попробовал вторую строку, как, например, 2 первые строки в коде будут:

#!/usr/bin/python

#!/usr/bin/python3

Возможно ли это? Есть ли способ поддержать как python, так и python3 для скрипта? Как и в первой, попробуйте первую строку shebang, если она не сработала, попробуйте вторую строку.

Вещи, которые я пытался доказать: я попытался изменить строку shebang на: #!/usr/bin/env python Но это не сработало.

Спасибо

Ответы [ 4 ]

5 голосов
/ 15 марта 2020

Вы можете просто не иметь шебанга и выполнить свой скрипт с соответствующим python двоичным файлом; например,

$ python3 yourscript.py

или

$ python yourscript.py

И вам не нужно разрешение на выполнение для вашего скрипта.

Поэтому, чтобы сделать его переносимым, используйте скрипт-обертку:

#!/bin/bash

if [ -x /usr/bin/python3 ]; then
  /usr/bin/python3 yourscript.py
else
  /usr/bin/python yourscript.py
fi
2 голосов
/ 15 марта 2020

Нет, вы не можете. Строка shebang является первой строкой сценария. Может быть только одна первая строка.

1 голос
/ 15 марта 2020

В соответствии с POSIX, системный вызов execve(2) должен смотреть только на первую строку скрипта для #! -линии. Поэтому использование более чем одной #! -линии не должно работать.

Согласно PEP-394 , на UNIX, python2 должно существовать, когда версия 2.x Python установлен, и python3 должен существовать, если установлена ​​версия Python 3.x.

Дистрибьютор ОС должен решить, присутствует ли команда python, и если да, то какую версию он использует. Таким образом, UNIX означает, что не будет , что python будет существовать.

Поэтому я бы предложил следующее:

  • Если ваш скрипт поддерживает Python 3, измените линию Шебанга на #!/usr/bin/env python3. Если это работает на всех Linux версиях, которые вы используете, это предпочтительное решение.
  • Если это не сработает, включите ваш скрипт в консольный скрипт пакета python с setup.py. Это обеспечит правильную линию при установке.

(PEP-394 поощряет распространителей сценариев навязывать пользователям использование виртуальных сред, что для IMO является ненужным осложнением для тех, кому не нужно установлены разные версии модуля.)

0 голосов
/ 15 марта 2020

Хотя я бы предложил всегда использовать python3 или отдельный скрипт-обертку, как подробно описано в других ответах, на самом деле технически возможно, чтобы скрипт Python служил в качестве собственного скрипта-обертки:

#!/bin/sh
"""": 
if type python3 > /dev/null 2>&1
then
    exec python3 "$0"
elif type python > /dev/null 2>&1
then
    exec python "$0"
else
    echo >&2 "Python not installed"
fi
exit 1
""" #"

print("Hello World")

Когда он запускается как Python скрипт, он просто запускается как обычный Python скрипт. При запуске в качестве сценария оболочки он снова вызывает себя с python3 или python.

...