我有一个在调用解释器时打印的MOTD类型的消息。目前这是打印在sitecustomize。如果解释器不处于交互模式,我想要禁止该消息;不幸的是,在网站自定义中, Tell if Python is in interactive mode中的所有支票都不起作用。 (sys.argv
,sys.ps1
,__main__.__file__
未填充。)是否有检查哪些在sitecustomize中工作?在sitecustomize中检查python交互模式
回答
也许这个想法检查解释交互性利用inspect
模块,并检查堆栈帧可能是一些使用到你:
http://mail.python.org/pipermail/pythonmac-sig/2002-February/005054.html
您也可以尝试直接在pydoc.help()
源,寻找其上面链接的代码片段受到了启发。
刚刚意识到您可以简单地利用包含交互式提示的文件与PYTHONSTARTUP
环境变量。只有在解释器以交互方式运行时,才会执行PYTHONSTARTUP
指向的文件中的命令。
http://docs.python.org/tutorial/interpreter.html#the-interactive-startup-file
如果你不希望设置的Python外的环境变量,你也可以设置变量所需的文件中sitecustomize.py
,但是当我试图寻找到它找到加载为了让我回到我的答案第一部分的链接。
JAB让我看代码,我最终想出了这个:
import ctypes
import getopt
ctypes.pythonapi.Py_GetArgcArgv.restype = None
ctypes.pythonapi.Py_GetArgcArgv.argtypes = [
ctypes.POINTER(ctypes.c_int),
ctypes.POINTER(ctypes.POINTER(ctypes.c_char_p))]
count = ctypes.c_int()
args = ctypes.pointer(ctypes.c_char_p())
ctypes.pythonapi.Py_GetArgcArgv(ctypes.byref(count), ctypes.byref(args))
argc = count.value
argv = [args[i] for i in range(count.value)]
if argc > 1:
interactive = False
opts, args = getopt.getopt(argv[1:], 'i')
for o, a in opts:
if o == '-i':
interactive = True
else:
interactive = True
有点儿丑(和Py3k的c_char_p必须c_wchar_p),但做这项工作。
很高兴你能找到一种能够按照你想要的方式工作的解决方案。 – JAB
检查sys.flags是一个更简洁的方法。
>>> import sys
>>> sys.flags.interactive
1
请注意,IDLE的性质也是交互式的,但标志没有设置。我会做如下:
>>> if sys.flags.interactive or sys.modules.has_key('idlelib'):
>>> pass # do stuff specific to interactive.
这只会检查是否在命令行上指定了-i ......如果解释器是“裸露”的,它仍然会将其置于交互模式下,从而失败。 – jtniehof
- 1. 在Python中:'import sitecustomize'失败;
- 2. 交互式Python
- 3. 交互式Python GUI
- 4. 交互式Python网络/图形建模
- 5. Python的交互模式如何工作?
- 6. Python交互模式下的错误?
- 7. SublimeREPL上的Python交互模式
- 8. matplotlib中的交互模式
- 9. 如何检查Python脚本是否以交互方式启动?
- 10. 在pythonbrew中使用交互式python
- 11. 检测python脚本在ipython中以交互方式运行时
- 12. 如何在cygwin中启用python交互模式?
- 13. 扩展Python交互式shell
- 14. 如何检查交互式shell中表达式的逻辑值?
- 15. 检查目录模式Python
- 16. DLV交互模式(调试)
- 17. Python中的交互式绘图?
- 18. Python中的交互式二维绘图
- 19. 在交互式Python,如何明确地导入模块
- 20. python在交互模式下运行时有什么不同?
- 21. 如何摆脱Python中的交互模式
- 22. Python中的ODE模型的交互式多点绘图
- 23. 在非交互模式下运行ipython
- 24. 在睡眠模式下与iPhone交互
- 25. HTML5中的交互式3D模型
- 26. 交互式和内联模式的Python应用程序
- 27. 在Python中以交互方式运行Python
- 28. 当以交互方式/非交互方式运行时,Python以不同方式导入模块
- 29. 检查互联网在Android模拟器
- 30. 在Python中,如何在交互模式下提供命令行参数
该代码不再在pydoc(检查日期...)和sitecustomize中的堆栈帧在交互模式和非交互模式之间没有区别。不过值得一试。 – jtniehof
突然意识到,对于您的情况,有一个令人惊讶的简单解决方案。再次看到我的答案。 – JAB
我想不出一个好的方法来处理这个问题,而不用踩在用户的PYTHONSTARTUP上,但它让我看着那个代码......看到我的答案。 – jtniehof