Когда вы вызываете скрипт Python, в чем разница между "./script.py" и "python script.py" - PullRequest
6 голосов
/ 22 марта 2012

Одно отличие состоит в том, что «./script.py» работает только в том случае, если script.py является исполняемым (как в разрешениях для файлов), но «python script.py» работает независимо. Тем не менее, я сильно подозреваю, что есть больше различий, и я хочу знать, какие они есть.

У меня есть веб-сайт Django, и "python manage.py syncdb" работает просто отлично, но "./manage.py syncdb" создает поврежденную базу данных по какой-то причине, которая остается для меня загадкой. Возможно, это связано с тем, что syncdb запрашивает имя и пароль суперпользователя из командной строки, и, возможно, использование «./manage.py syncdb» изменяет способ взаимодействия с командной строкой, таким образом изменяя пароль. Может быть? Я просто сбит с толку этой ошибкой. "python manage.py syncdb" полностью исправляет это, так что это просто любопытство.

Спасибо.

Редактировать: Хорошо, верно, я забыл о необходимости строки shebang #! / Usr / bin / python. Но я только что проверил, «python manage.py syncdb» и «./manage.py syncdb» используют один и тот же интерпретатор Python (2.7.2, единственный установленный на Linux Mint 12). И все же первый работает, а второй нет.

Могут ли переменные среды, видимые кодом Python, отличаться? Мой код требует, чтобы $ LD_LOADER_PATH и $ PYTHON_PATH были установлены специально для каждой оболочки.

Ответы [ 4 ]

6 голосов
/ 22 марта 2012

Вызов ./script.py использует «строку Шебанга» в сценарии, чтобы определить, какой интерпретатор использовать для запуска сценария. Такая строка может выглядеть как

#!/usr/bin/env python

или

#!/usr/bin/python2.7

или любой другой путь к интерпретатору python. Если он разрешается к тому же интерпретатору Python, который вызывается просто

python

из командной строки оболочки, между ./script.py и python script.py нет никакой разницы, но в двух версиях могут использоваться разные интерпретаторы Python.

1 голос
/ 22 марта 2012

./script.py = "Попытка выполнить файл с именем script.py в текущей оболочке"

python script.py = "Отправить script.py в качестве аргумента для первого python исполняемого файла в текущем$PATH "

Первый работает только в том случае, если для файла задан бит выполнения, установленный для пользователя, пытающегося выполнить файл и , так называемый shebang строка, которая сообщает оболочке, как ее запустить.

0 голосов
/ 22 марта 2012

В Linux с помощью терминала вы можете выполнить любой файл, если у пользователя есть разрешение на выполнение, набрав ./fileName. Когда ОС видит допустимый заголовок, такой как #! /usr/bin/python (или для perl #! /usr/bin/python), она вызывает интерпретатор python или perl (соответствующий) для выполнения программы. Вы можете использовать команду python script.py напрямую, потому что python - это исполняемая программа, расположенная в /usr/bin (или где-то еще), которая находится в переменной окружения $ PATH, что соответствует каталогу исполняемых файлов.

0 голосов
/ 22 марта 2012

. / Script.py запускает интерпретатор, определенный в #! в начале файла.Например, первая строка может быть #! /usr/bin/env python или #! /usr/bin/python или что-то подобное.Если вы посмотрите, какой интерпретатор вызывается, вы сможете решить эту проблему.

...