V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Garasu
V2EX  ›  Python

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

  •  
  •   Garasu · 67 天前 · 1796 次点击
    这是一个创建于 67 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    12 条回复    2024-09-16 17:36:12 +08:00
    so1n
        1
    so1n  
       67 天前
    如果是 3.10+,可以直接调用 sys.orig_argv
    vituralfuture
        2
    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
        3
    NoOneNoBody  
       67 天前   ❤️ 1
    sys.argv[0] 就是啊
    Garasu
        4
    Garasu  
    OP
       67 天前
    @NoOneNoBody 确实, 是我表述不清。

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

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

    python3.8 的问题吗。。。
    Garasu
        8
    Garasu  
    OP
       67 天前
    @NoOneNoBody
    我需要在 sitecustomize 运行时候判断是调用的哪个模块,sitecustomize 里输出 __file__ 是自己的,不是调用模块的。
    ipwx
        9
    ipwx  
       67 天前
    sys.modules['__main__']
    Garasu
        10
    Garasu  
    OP
       66 天前
    @ipwx it 's work.
    感谢,这部分内容你是从哪里看到的? 想学习下。
    ZzFoo
        11
    ZzFoo  
       66 天前
    What happens when you import a module? - presented by Reuven M. Lerner

    我觉得这个讲得挺好 @Garasu
    ipwx
        12
    ipwx  
       66 天前
    @Garasu 忘了。我印象中第一次接触 sys.modules 是为了实现 werkzeug.utils.import_string 类似的东西。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3292 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 12:01 · PVG 20:01 · LAX 04:01 · JFK 07:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.