如何获取当前运行的模块路径/名称

Dan*_*ure 30 python python-2.6

我搜索过,这似乎是一个简单的问题而没有一个简单的答案.

我有a/b/c.py要调用的文件python -m a.b.c.我想获得a.b.c模块级别的值.


USAGE = u'''\
Usage:
    python -m %s -h
''' % (what_do_i_put_here,)
Run Code Online (Sandbox Code Playgroud)

因此,当我收到-h选项时,我会显示USAGE而不需要在每个脚本中实际记下实际值.

我真的需要通过inspect才能获得所需的价值吗?

谢谢.

编辑:如上所述,有答案(我已经搜索过),但不是简单的答案.使用inspect,使用traceback或操作__file__,__package__并做一些子串来得到答案.但没有什么比我在模块中有一个类的简单,我可以使用myClass.__module__,我会得到我想要的答案.__name__(不幸的是)使用是无用的,因为它总是如此__main__.

此外,这是在python 2.6中,我不能使用任何其他版本.

Sha*_*awa 26

这对我有用:

__loader__.fullname
Run Code Online (Sandbox Code Playgroud)

另外如果我从一个\来做python -m bc,我按预期得到'bc'.

不完全确定__loader__属性是什么,所以让我知道这是不是很好.

编辑:它来自PEP 302:http://www.python.org/dev/peps/pep-0302/

链接中有趣的片段:

load_module()方法运行任何代码之前必须履行一些职责:

...

  • 它应该为模块添加一个__loader__属性,设置为loader对象.这主要用于内省,但可用于特定于导入程序的附加功能,例如获取与导入程序关联的数据.

因此看起来它应该在所有情况下都能正常工作.

  • 对我来说,它需要是`__loader __.name`.请参阅https://docs.python.org/3/library/importlib.html#importlib.abc.FileLoader上的doc (6认同)

Chr*_*ips 11

我想你实际上在寻找__name__特殊变量.从Python文档:

在模块中,模块的名称(作为字符串)可用作全局变量的值__name__.

如果直接运行文件,则此名称将为__main__.但是,如果您在模块中(如使用-m标志或任何其他导入的情况),它将是模块的完整名称.

  • 如果使用"-m"标志调用,_ __ name _\_将为"main". (5认同)

dap*_*wit 8

使用-m运行时,sys.path[0]包含模块的完整路径.您可以使用它来构建名称.

来源:http://docs.python.org/using/cmdline.html#command-line

另一种选择可以是__package__模块内可用的内置变量.


hyg*_*ull 7

有很多选项可以获取当前模块的路径/名称。

首先熟悉Python中__file__的使用,点击查看用法

它保存当前加载的模块的名称。

检查/尝试以下代码,它适用于Python2Python3

» module_names.py

import os

print (__file__)
print (os.path.abspath(__file__))
print (os.path.realpath(__file__))
Run Code Online (Sandbox Code Playgroud)

MAC OS X 上的输出

MacBook-Pro-2:practice admin$ python module_names.py 
module_names.py
/Users/admin/projects/Python/python-the-snake/practice/module_names.py
/Users/admin/projects/Python/python-the-snake/practice/module_names.py
Run Code Online (Sandbox Code Playgroud)

所以这里我们得到了当前模块名称的名称及其绝对路径