技术求助: Python 启动文件识别

67 天前
 Garasu

python 的 Sitecustomize 可以在 python 运行前执行一些前置任务, 但是如何获取本次启动 Python 时,运行的是哪个脚本或模块?

比如 Python test.py , 如何在 sitecustomize 中获取 test.py 这个文件名?

sys.argv 似乎接收不到这个文件名。

说起来,除了 python test.py 这种在命令行后跟文件名的启动方式外,还有别的吗?

1796 次点击
所在节点    Python
12 条回复
so1n
67 天前
如果是 3.10+,可以直接调用 sys.orig_argv
vituralfuture
67 天前
方法其实很多,参考 https://docs.python.org/3/tutorial/interpreter.html 可以从标准输入读取脚本内容交互式的执行,还可以 python main.py 这样执行脚本文件,还可以使用 python -m xxx 的方式执行脚本,还可以使用 python -c "print('xxx')"这样的形式执行来自命令行参数的脚本内容,甚至可以用 python -i main.py 的形式,执行完 main.py 后进入交互模式

但其实 python 内部并没有这么多区别,参考 python3.10 源码,总共只有四种,分别是执行文件,执行模块,执行来自命令行参数的脚本,执行来自标准输入的脚本
https://github.com/python/cpython/blob/0c5fc27217525c4e40b4064e6979f467540c2fc8/Modules/main.c#L581-L595
NoOneNoBody
67 天前
sys.argv[0] 就是啊
Garasu
67 天前
@NoOneNoBody 确实, 是我表述不清。

python -m 这种方式启动的话,sys.argv 只能拿到 -m 参数 ,看不到模块名。
NoOneNoBody
67 天前
__file__ 是当前 py 文件的绝对路径,剩下就自己想办法传给需要用到的地方
nagisaushio
67 天前
Garasu
67 天前
@nagisaushio @vituralfuture

文档是说 -m 模式启动,第一个参数会是模块名。。。但是我拿到的怎么是 -m 。。。

python3.8 的问题吗。。。
Garasu
67 天前
@NoOneNoBody
我需要在 sitecustomize 运行时候判断是调用的哪个模块,sitecustomize 里输出 __file__ 是自己的,不是调用模块的。
ipwx
67 天前
sys.modules['__main__']
Garasu
67 天前
@ipwx it 's work.
感谢,这部分内容你是从哪里看到的? 想学习下。
ZzFoo
66 天前
What happens when you import a module? - presented by Reuven M. Lerner
<amp-youtube data-videoid="Aty6rJIvpfU" layout="responsive" width="480" height="270"></amp-youtube>
我觉得这个讲得挺好 @Garasu
ipwx
66 天前
@Garasu 忘了。我印象中第一次接触 sys.modules 是为了实现 werkzeug.utils.import_string 类似的东西。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1073175

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX