2012-03-22 3 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"はそれを完全に修正するので、これは単に好奇心です。

ありがとうございました。

編集:右、右、シバンライン#!/ 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 line"が使用され、スクリプトの実行に使用するインタープリタが決まります。そのようなラインは

#!/usr/bin/env python 

または

#!/usr/bin/python2.7 

またはPythonインタプリタへのどんなパスが使用されているように見えるかもしれません。それだけで

python 

シェルのコマンドラインからによって呼び出され、同じPythonインタプリタに解決される場合、そこ./script.pypython script.pyの間に違いはありませんが、2つのバージョンが異なるのPythonインタプリタを使用して終了することができます。

0

./script.pyは、ファイルの先頭に#!で定義されたインタープリタを実行します。たとえば、最初の行は#! /usr/bin/env pythonまたは#! /usr/bin/pythonなどです。どのインタプリタが呼び出されたかを見ると、その問題を修正できる可能性があります。

1

./script.py =

python script.py

は=

「現在の$PATHに最初python実行可能ファイルに引数としてscript.pyを送る」「現在のシェルにscript.pyと呼ばれるファイルを実行しようとし、」最初は場合にのみ機能しますそのファイルは、のファイルを実行しようとしているユーザに対して実行ビットが設定されています。これは、実行する方法をシェルに知らせる、いわゆるshebang行です。

0

端末を使用しているLinuxでは、ユーザが実行権限を持っている場合は、 ./fileNameと入力すると、任意のファイルを実行できます。 OSが#! /usr/bin/python(またはperl #! /usr/bin/python)のような有効なヘッダを見ると、PythonまたはPerl(適切な)インタプリタを呼び出してプログラムを実行します。python script.pyを直接使用することができます。pythonは、/usr/bin(または他の場所)にある実行可能プログラムで、実行可能ファイルのディレクトリに対応する環境変数$ PATH、 にあります。