2

rakePHPのリストに追加: Python 関数またはメソッドが、.pyスクリプト ファイル内から呼び出されるのではなく、Python シェルから直接呼び出されたかどうかをテストする方法はありますか?

たとえばtest_expr、式がモジュール「shelltest.py」に表示されると、次のように動作する式を定義したいとします。

#!/usr/bin/python
"""Module shelltest.py"""

def test_expr():
    #...

ケース (1):Trueシェルから直接呼び出すと生成される

>>> import shelltest
>>> shelltest.test_expr()
True

ケース (2):False別のモジュール「other.py」にインポートされ、そこでコードで使用されると生成されます。

#!/usr/bin/python
"""Module other.py"""

import shelltest

def other_func():
    # ...
    shelltest.test_expr()

これはシェルから呼び出されます

>>> import other
>>> other.other_func()
False
4

4 に答える 4

4

シェルにいる場合は、__name__ == '__main__'. (さらに、Ned Batchelder が指摘しているように、これは関数が定義された場所のみを示します。)

おそらく、関数内でこれをテストしたくないでしょう。代わりに、モジュールがメインプログラムとして呼び出されているかどうかを区別するために使用されます。関数はおそらく関係なく同じように機能するはずです。別の関数が必要な場合は、同じ関数名を含む別のモジュールをインポートする必要があります。

次のようにします。

if __name__ == '__main__':
   import formain as bumpf
else:
   import forscripts as bumpf

bumpf.domagic()

Web 環境にいるかどうかの判断については、Web からのみ呼び出されるコードで行います。通常、Python スクリプトは CGI によって呼び出されないため、これはユース ケースとして実際には発生しません。

于 2013-01-05T22:01:02.553 に答える
2
>>> import sys
>>> called_via_shell = lambda: sys.stdin.isatty()
>>> called_via_shell()
True

詳細とコード例はこちら: http://pleac.sourceforge.net/pleac_python/userinterfaces.html#AEN795

于 2013-01-05T22:09:22.807 に答える
0

これを確認する私のお気に入りの方法は、 を確認することですsys.ps1

Python 2.7.3 (default, Aug  1 2012, 05:14:39) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> print sys.ps1
'>>> '
$ cat > script.py
#!/usr/bin/env python
import sys
print sys.ps1
$ python script.py 
Traceback (most recent call last):
  File "script.py", line 3, in <module>
    print sys.ps1
AttributeError: 'module' object has no attribute 'ps1'

スクリプトとインタラクティブシェルにある__name__ため、他の答えは間違っていると思います。__main__

于 2013-01-05T22:02:43.270 に答える
-1

このモジュールがシェルから実行された場合、__name__に設定され__main__ます。それ以外の場合は、呼び出しモジュールの名前に設定されます。このイディオムは、モジュールで常に表示されます。

if __name__ == '__main__':
  # do something with the library
于 2013-01-05T22:01:09.530 に答える