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

How to get the current running module path/name

我已经搜索过了,这似乎是一个没有简单答案的简单问题。

我有文件a/b/c.py,可以用python -m a.b.c调用。我想获得模块级中的值a.b.c

1
2
3
4
USAGE = u'''\
Usage:
    python -m %s -h
'''
% (what_do_i_put_here,)

所以当我收到-h选项时,我显示USAGE,而不需要在每个脚本中实际写下实际值。

我真的需要通过inspect来获得所需的值吗?

谢谢。

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

另外,这是在Python2.6中,我不能使用任何其他版本。


这为我工作。

1
__loader__.fullname

另外,如果我的卡车从Python的M -我的卡车得到的预期。

什么是不完全确定的属性是一_ _ _ _装载操作系统让我知道,如果这是很好的。

编辑:这是来自PEP 302:http://www.python.org /开发/系统/ PEP 0302号

摘要:从有趣的链接

The load_module() method has a few responsibilities that it must
fulfill before it runs any code:

...

  • It should add an __loader__ attribute to the module, set to the
    loader object. This is mostly for introspection, but can be used
    for importer-specific extras, for example getting data associated
    with an importer.

所以它看起来像它应该工作的精细在所有情况下。


我觉得你真的在寻找__name__特殊变量。从Python的文档:

Within a module, the module’s name (as a string) is available as the value of the global variable __name__.

如果你直接运行的文件,这将__main__名称。然而,如果你的模块的情况下,你使用的M -或任何其他标志,进出),它将是完整的模块的名称。


当运行与sys.path[0]米,包含全路径的模块。你可以用这样的名称来构建的。

来源:http:////cmdline.html # docs.python.org使用命令行

另一种选择可能是可变的__package__内置在其中可用的模块。


唯一的方式是与os.getcwd路径操作(),os.path,文件和whatnot,你提到的。

事实上,它可能是好的补丁的实施,目前是optparse / argparse("%)"替换字符串中使用与os.path.basename(sys.argv [ 0 ])——你是用optparse,好吗?-另一个字符串),即为特殊类模块。


为什么不能有这样的限制,国有企业的"ABC米的Python。"当然,目前的一些模块可以在拉链或任何,但我宁愿整个包装方法和简化的脚本,这使得确定的执行发生在正确的上下文,以正确的Python实例。

该包装包含的:小的CAN

1
2
import sys
__import__(sys.argv[1])

然后你可以用你喜欢的方法是把这个模块的名称的使用。

回到原来的要求。如果我的想法是,understood正确地运行,有一些Python文件子目录中找到的消息,这是由使用该模块,some.mega.package真的。

我认为,有没有可靠的方法来确定一个通用的,如果想运行的卡车或ABC C,没有文件系统的分析模块,以确定有无(_说,寻找所有_ init .py的_ _目录外的点,直到有没有更多的_ _ init .py,甚至_ _)它不是100%的分析。


为什么没有人提到.__module__真的吗?

当你要做一self.__module__模块路径。你也可以在这样的类:

1
2
3
4
5
Class A:
   self.__module__  # gets module.filename

def get_module():
    A.__module__ # also gets module.filename


有一些选项,以获得当前的路径/模块的名称。

第一是熟悉使用_ _ _ _ Python中的文件,点击这里查看使用。

认为在当前加载的模块的名称。

下面的代码检查/尝试,它将工作在python2 &;python3。

1
2
3
4
5
6
7
# module_names.py

import os

print (__file__)
print (os.path.abspath(__file__))
print (os.path.realpath(__file__))

在Mac OS X的输出:

1
2
3
4
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

在这里,我们得到了该操作系统的名称的名称和它的电流模块的绝对路径。


你应该在你的a.b.c硬编码的帮助,如果你的包,这样的distribute然后就是这样打电话给它,无论是在a位于文件系统的,它是长在PYTHONPATH it’ll Be进口。