我已经搜索过,这似乎是一个简单的问题而没有一个简单的答案。
我的文件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中,我不能使用任何其他版本。
答案 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__是唯一变量,它返回当前模块的文件路径。