Невозможно передать аргумент python с помощью "#!/usr/bin / env python"



мне нужно было иметь непосредственно исполняемый скрипт python, поэтому я начал файл с #!/usr/bin/env python. Однако мне также нужен небуферизованный выход, поэтому я попробовал #!/usr/bin/env python -u, но это не удается с python -u: no such file or directory.



узнал, что #/usr/bin/python -u работает, но мне это нужно, чтобы получить python на PATH для поддержки virtual env средах.



Каковы мои варианты?

588   9  

9 ответов:

для этого лучше использовать переменную окружения. См. python doc:http://docs.python.org/2/using/cmdline.html

для вас:

export PYTHONUNBUFFERED=1
script.py

в некоторых средах env не разделяет аргументы. Таким образом, ваш env ищет "python-u" на вашем пути. Мы можем использовать рыбу, чтобы обойти. Замените свой shebang следующими строками кода, и все будет хорошо.

#!/bin/sh
''''exec python -u -- "" ${1+"$@"} # '''
# vi: syntax=python

p. s. нам не нужно беспокоиться о пути к sh, верно?

когда вы используете shebang в Linux, вся остальная строка после имени интерпретатора интерпретируется как один аргумент. Элемент python -u передается в env как будто вы набрали:/usr/bin/env 'python -u'. Элемент /usr/bin/env поиск двоичного файла под названием python -u, где его нет.

передача аргументов в строку shebang не является стандартной и, как вы экспериментировали, не работает в сочетании с env в Linux. Решение с bash заключается в использовании встроенной команды "set" для установки необходимых параметров. Я думаю, что вы можете сделать то же самое, чтобы установить небуферизованный вывод stdin с помощью команды python.

my2c

вот сценарий, альтернативный /usr/bin /env, который позволяет передавать аргументы в строке хэш-bang на основе/bin / bash и с ограничением, что пробелы запрещены в исполняемом пути. Я называю это "envns" (env No Spaces):

#!/bin/bash

ARGS=(  )  # separate  into multiple space-delimited arguments.
shift # consume 

PROG=`which ${ARGS[0]}`
unset ARGS[0] # discard executable name

ARGS+=( "$@" ) # remainder of arguments preserved "as-is".
exec $PROG "${ARGS[@]}"

предполагая, что этот скрипт находится в /usr / local/bin/ envns, вот ваша строка shebang:

#!/usr/local/bin/envns python -u

протестировано на Ubuntu 13.10 и cygwin x64.

Это может быть немного устаревшим, но env (1) руководство говорит, что можно использовать '-S' для этого случая

#!/usr/bin/env -S python -u

это, кажется, работает довольно хорошо на FreeBSD.

Это Клудж и требует Баш, но он работает:

#!/bin/bash

python -u <(cat <<"EOF"
# Your script here
print "Hello world"
EOF
)

отталкиваясь от ответа Ларри Цая,env позволяет задать переменную непосредственно в командной строке. Это значит, что -u может быть заменен эквивалентной PYTHONUNBUFFERED перед python:

#!/usr/bin/env PYTHONUNBUFFERED="YESSSSS" python

работает на RHEL 6.5. Я почти уверен, что особенность env как раз о всеобщем.

недавно я написал патч для версии GNU Coreutils env для решения этой проблемы:

http://lists.gnu.org/archive/html/coreutils/2017-05/msg00018.html

если у вас есть это, вы можете сделать:

#!/usr/bin/env :lang:--foo:bar

env раскол :lang:foo:--bar в поле lang,foo и --bar. Он будет искать PATH для переводчика lang, а затем вызвать его с аргументами --foo,bar плюс путь к скрипту и аргументы этого сценария.

есть также возможность передать имя скрипта в середине опций. Предположим, вы хотите запустить lang -f <thecriptname> other-arg, а затем остальные аргументы. С этой заплаткой env, это делается так:

#!/usr/bin/env :lang:-f:{}:other-arg

крайнее левое поле, которое эквивалентно {} заменяется следующим первым аргументом, который при вызове hash bang является именем скрипта. Этот аргумент удаляется.

здесь, other-arg может быть что-то обрабатывается lang или, возможно, что-то обрабатывается скриптом.

чтобы лучше понять, увидеть многочисленные echo тестовые случаи в патче.

я выбрал : символ, потому что это существующий разделитель, используемый в PATH на системах POSIX. Так как env тут PATH поиск, это исчезающе вряд ли будет использоваться для программы, имя которой содержит двоеточие. Элемент {} маркер происходит от find утилиты, которая использует это для обозначения вставки пути в -exec командная строка.

Comments

    Ничего не найдено.