Невозможно передать аргумент 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 средах.
Каковы мои варианты?
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=pythonp. 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