2012-03-22 1 views
6

Одно из отличий заключается в том, что «./script.py» работает только в том случае, если script.py является исполняемым (как в разрешения файлов), но «python script.py» работает независимо. Тем не менее, я сильно подозреваю, что есть больше различий, и я хочу знать, что они собой представляют.При вызове сценария Python в чем разница между «./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, которые будут установлены специально для каждой оболочки.

ответ

6

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

#!/usr/bin/env python 

или

#!/usr/bin/python2.7 

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

python 

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

0

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

1

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

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

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

0

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