2011-11-10 15 views
1

私はPythonスクリプトを持っていて、どのように実行可能にするのか不思議でした。言い換えれば、bashのようなシェルを使ってどのように動かすことができますか?実行ファイルをシェルで使用する方法 - Python

私は最初の行が最初の行であることを知っていますが、次に、特定の順序(トップまたはボトムの主なもの)になるような関数が必要ですか?さらに、Pythonファイルの拡張子.pyを保持する必要があります(関数Dosomethingを呼び出すことはできますか?)。

簡単に言えば、Pythonファイルを実行可能にするために重要なポイントを教えてください。最初の行に

#! /bin/env python 

答えて

2

これは私が実行可能なスクリプトを作成する方法です。それはeggsかそのようなものを考慮に入れません。それは私が実行できるようにしたいだけの単純なスクリプトです。私はあなたがLinuxを使用していると仮定しています。

#! /usr/bin/env python 
import sys 


def main(): 
    # 
    # Do something ... Whatever processing you need to do, make it happen here. 
    # Don't shove everything into main, break it up into testable functions! 
    # 
    # Whatever this function returns, is what the exit code of the interpreter, 
    # i.e. your script, will be. Because main is called by sys.exit(), it will 
    # behave differently depending on what you return. 
    # 
    # So, if you return None, 0 is returned. If you return integer, that 
    # return code is used. Anything else is printed to the console and 1 (error) 
    # is returned. 
    # 
    if an_error_occurred: 
     return 'I\'m returning a string, it will be printed and 1 returned' 

    # Otherwise 0, success is returned. 
    return 0 

# This is true if the script is run by the interpreter, not imported by another 
# module. 
if __name__ == '__main__': 
    # main should return 0 for success, something else (usually 1) for error. 
    sys.exit(main()) 

ここで、権限が正しく設定されていれば、このスクリプトを実行できます。

あなたのスクリプトが処理されるにつれて、各行がインタープリタで実行されることを、ひとつ気づかせてください。これは、プロセッサがどのように「取得」しているかにかかわらず、真です。つまり、スクリプトをモジュールとしてインポートし、スクリプトとして実行することは、モジュールの各行を実行するという点で、基本的に同じです。

スクリプトが実行されているときにスクリプトが実行されていることがわかったら、関数の順序は重要ではないことに気づきます。関数宣言は関数宣言です。 が重要な機能です。

ので、一般的には、スクリプトのレイアウトはすべて、この

def func1(): 
    pass 
def func2(): 
    pass 
def main(): 
    return 0 

if __name__ == '__main__': 
    sys.exit(main()) 

のように見えるあなたは、あなたがそれらを使用する、あなたが最初に使用したい関数を作成します。それが役に立てば幸い。

+0

BLOODY地獄!それは私が話しているものです!非常にジャイメ、素晴らしいもの、素晴らしい説明ありがとう!それはそのように動作します!歓声メイト! – eikonal

0

唯一のことは、(あなたがそれを言ったように)含めることです。そして必須ではありませんが、推奨されています。 その後、あなただけ書いて、それを呼び出すことができます。

python [filename].py 

を端末内やbashファイルに。

0

あなたはそれを実行権限を与えることもあります:

chmod u+x yourfile.py 
0

は、最初のスペースを削除します。つまり、

#!/usr/bin/env python 

ファイルの最初の行にする必要があります。次に、ファイルのパーミッションを実行可能ファイルに設定してください:

chmod u+x your_script.py 

Pythonスクリプトは順番に実行されます。

if __name__ == '__main__': 
    main() 

)(メインは、スクリプトの実行を開始:あなたが機能で満たされたファイルを持っている場合は、一般的な方法は、ファイルの一番最後に、このようなものを持っていることです。 main()の裸呼び出しではなく、このようにする理由は、スクリプトを変更せずにモジュールのように動作させることができるからです。 main()を呼び出した行が1つだけだった場合、モジュールはスクリプトのmainを実行します。あなたのスクリプトは、すなわち、それはスクリプトとして実行されている、__main__名前空間で実行されている場合if文だけをチェックします。

0

あなたは、例えば、説明したようにあなたがSHAバンを追加する必要があります

#!/usr/bin/python 

したり、ファイルの最初の行として

#!/usr/bin/env python 

、あなたはあなたが特定のファイルには、他に何もする必要はありません

chmod +x Dosomething 

を実行することによってそれを実行可能にする必要があり名前はDosomethingを含む何でもよい。(ファイルがどこにある現在の作業ディレクトリがあると仮定して)あなたのPATHは、おそらくファイルが存在するディレクトリが含まれていないので、あなたはこのようにそれを実行する必要があります。

./Dosomething 
+0

'#!/usr/bin/env python'は、Pythonが '/ usr/bin'にインストールされていない場合、他のディレクトリにインストールされている方が柔軟性があります。 – Lycha

+0

確かに。ありがとう、Lycha! –

0

テンプレートに従ってくださいあなたのコード

# any functions I want to define, and will be accessible when imported as module 
# or run from command line 
... 

if __name__ == '__main__': 
    # things I want to do only when I run it from the command line 
    ... 

あなたがpython fileName.pyを使用することなく、それを実行できるようにしたいのではなく、単に./fileName.pyなら、あなたは

#!/usr/bin/env python 
012ファイルの最初の行にする必要が生じます

そして、あなたはあなたのファイルへの.py拡張子を追加しない場合、それはまだ、コマンドラインから実行可能であること...しかし、他のモジュールによってインポート可能なありませんユーザー少なくとも

chmod u+x fileName.py 

でファイルを実行可能にします。最初の行に

+0

@eddieantonio私のファイルはもちろん実行可能ですが、最初の行は '#!/ usr/bin/env python'ですが、何も起こりません(シェルのpythonで動作します)。 if __name__ == '__main__'を使用して:def main()私にエラーを与える(基本的に私はメインを定義する必要があります)。上のメイン関数でスクリプトを編成する必要がありますか? – eikonal

0
  1. 場所#!/usr/bin/python
  2. あなたは次のように、あなたのPythonスクリプトの任意の名前を付けることができます。myPythonScript(いいえ、あなたはの.py拡張子を維持する必要はありません)
  3. chmod +x myPythonScript
  4. それを実行します。./myPythonScript

例:myPythonScript

#!/usr/bin/python 
print "hello, world!" 
関連する問題