2

添加到rakePHP列表:有没有办法测试 Python 函数或方法是否已直接从 Python shell 调用,而不是从.py脚本文件中调用?

例如我想定义一个表达式,test_expr当表达式出现在模块“shelltest.py”中时,其行为如下,

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

def test_expr():
    #...

案例(1):True直接从 shell 调用时产生

>>> 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

如果你在 shell 中,那么__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__脚本和交互式 shell 中。

于 2013-01-05T22:02:43.270 回答
-1

如果此模块是从 shell 执行的,__name__将设置为__main__. 否则,它将被设置为调用模块的名称。你会一直在模块中看到这个习语:

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