2017-01-27 9 views
2

端末でPythonスクリプトを実行するのが初めてです。スクリプト./filename.pyを実行し、chmod + x filenameで実行可能であることを確認しました。私は#!/ usr/bin/env pythonをプログラムの先頭に置いています。私はエラーは発生していませんが、私のプリントステートメントは私の端末に表示されていません。私のコードが添付されています。何か案は?端末でスクリプトを実行しているときに印刷文が表示されない

#!/usr/bin/env python 

import ctypes 
import os 

def is_hidden(filepath): 
    name = os.path.basename(os.path.abspath(filepath)) 
    return ('.' + name) or (has_hidden_attribute(filepath)) 

def has_hidden_attribute(filepath): 
    try: 
     attrs = ctypes.windll.kernel32.GetFileAttributesW(unicode(filepath)) 
     assert attrs != -1 
     result = bool(attrs & 2) 
    except (AttributeError, AssertionError): 
     result = False 
    return result 

def main(): 
    print ('whatup') 
    print(is_hidden('~/.jupyter')) 
    print('hey') 

そして、端末

$ ./makepass_jup.py 
$ 
+1

あなたは 'Java'または' C'バックグラウンドから来ていますか? Pythonの 'main'関数は特別なことはありません。実際に呼び出す必要があります。 –

答えて

1

からこのスクリプトは、単に機能の束を定義します。実行するには実際にmain()に電話する必要があります。

4

あなたはどこでもmain関数を呼び出しているわけではありません。ファイルの末尾にこれを追加します。ここ

if __name__ == '__main__': 
    main() 

if文はPythonで一般的なパターンです。 ファイルをモジュールとしてインポートするときに、コード実行を防ぐためのガードとして機能します。 Pythonインタプリタがファイルをインポートすると、__name__が変数に設定されます。 このファイルを別のモジュールからインポートする場合は、__name__がモジュールの名前に設定されます。しかし、ファイルがメインプログラムとして実行された場合、変数は__main__に設定されるため、そのステートメント内のコードは、ファイルがプログラムとして実行された場合にのみ実行されます。

詳細については、受け入れられた回答What does if __name__ == “__main__”: do?を参照してください。

+0

このコードの機能とその働きを説明してください。最後に 'main()'コールを追加するだけではどうですか? – martineau

+0

それは方法や理由ではなく、ただそれだけです。 – martineau

+1

Pythonインタプリタは、ファイル内のすべてのコードを実行します。 このファイルをインポートした場合、if文を使用しないとコードは常に実行されます。 しかし、コマンドラインから実行すると、モジュールの名前を含む '__name__'変数は '__main__'になり、コードが実行されます。 基本的には、ファイルをモジュールとしてインポートする場合に実行したくないコードの実行を防ぐことです。 詳細については、この質問を参照してください:http://stackoverflow.com/questions/419163/what-does-if-name-main-do –

4

main()関数は、CやJavaなどの他の言語とは異なり、エントリポイントではありません。他の人が指摘したように、main()はあなたのコードのどこでも呼び出されていません。次のように

あなたは自分のモジュールのトップレベルであなたのmain()関数を呼び出すことがあります。

import ctypes 
import os 

(your functions) 

main() 

どちらかあなたがpythonコマンドまたはインポートでこれを直接実行したときただし、トップレベルのすべてが評価されますこのモジュールは他の場所から次のようにスクリプトのファイル名がcallee.pyであり、あなたがcaller.pyと呼ばれる別のスクリプトを書いているとしましょう:

import callee 

その後callee.pyのトップレベルにあるすべての文がmain()含めて、評価されます。これがあなたの意図でない場合は、__name__という変数をチェックして、スクリプトがコマンドラインから直接呼び出されたかどうかを確認できます。スクリプトを直接コマンドラインから呼び出された場合

if __name__ == '__main__': 
    main() 

__name__の値が__main__になります。それ以外の場合は、モジュールの名前になります。この場合、callee

関連する問題