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

时间:2011-03-03 16:32:42

标签: 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,)

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

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

感谢。

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

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

9 个答案:

答案 0 :(得分:26)

这对我有用:

__loader__.fullname

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

不完全确定__loader__属性是什么,所以如果这不合适,请告诉我。

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

链接中有趣的摘录:

  

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

     

...

     
      
  • 它应该为模块添加一个__loader__属性,设置为    装载机对象。这主要是为了内省,但可以使用    对于特定于导入程序的附加项,例如获取数据关联    与进口商。
  •   

所以看起来它应该在所有情况下都能正常工作。

答案 1 :(得分:11)

我认为你实际上在寻找__name__特殊变量。来自Python documentation

  

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

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

答案 2 :(得分:8)

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

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

另一个选项可能是__package__内置变量,可在模块中使用。

答案 3 :(得分:1)

唯一的方法是使用os.getcwd(),os.path, file 等进行路径操作,如上所述。

实际上,对于optparse / argparse(它当前用os.path.basename(sys.argv [0])替换使用字符串中的“%prog”,它可能是一个很好的补丁 - 你使用optparse,对吗? - ),即另一个特殊字符串,如%module。

答案 4 :(得分:0)

无法理解为什么存在“python -m a.b.c”这样的限制。当然,实际的模块可能在某些zip或其他内容中,但我宁愿使用包装器脚本简化整个方法,这样可以确保在正确的上下文中使用正确的python实例执行。

包装器可以包含:

import sys
__import__(sys.argv[1])

然后,您可以使用自己喜欢的方法获取模块名称以供使用。

回到原来的要求。如果我理解正确,那就是有人在某个子子目录中运行python文件,从使用消息中找出它实际上是some.mega.package的模块。

我认为,没有可靠的通用方法来确定是否要运行c,bc或abc模块,没有一些文件系统分析和某些启发式(比如,在外部目录中查找所有__init__.py直到这些点没有更多__init__.py),即使分析它不是100%。

答案 5 :(得分:0)

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

首先要熟悉在Python中使用 __ file __ Click here to see the usage

它包含当前加载的模块的名称。

检查/尝试以下代码,它将适用于 Python2 &的 Python3

[1]  TRUE FALSE
MAC OS X上的

输出

# module_names.py 

import os

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

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

答案 6 :(得分:-1)

你应该在你的帮助中对a.b.c进行硬编码,如果你这样分发包那么无论文件系统中a位于何处,都可以调用它,只要它在PYTHONPATH上就可以了它会被导入。

答案 7 :(得分:-1)

为什么没有人提到ConnectionError: ('Connection aborted.', BrokenPipeError(32, 'Broken pipe'))

执行.__module__时,您将获得模块路径。 您也可以在课外进行此操作:

self.__module__

答案 8 :(得分:-1)

这里是超级用户的专用衬套。

对于 Linux 用户,将“ \\”替换为“ /”。

请注意优点是 它不需要导入os模块,可以轻松,独立地工作。

modulename=__file__.split("\\")[-1].split('.')[0]

说明:

用斜杠分割后选择最后一个元素,然后用点“。”分割第一个元素。因为第一步提供的是module.py,第二步仅提供的是“模块”。 __file__是唯一变量,它返回当前模块的文件路径。