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

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

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

1

2

3

4USAGE = u'''\

Usage:

python -m %s -h

''' % (what_do_i_put_here,)

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

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

谢谢。

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

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

这条线对你有帮助吗?stackoverflow.com/questions/247770/…

有多个副本候选:stackoverflow.com/questions/4288905/…,stackoverflow.com/questions/1450478/…

我认为这不是重复的:在前面的注释中,引用的问题旨在获取文件系统上正在执行的文件的路径,而po希望获取当前的python包+模块

这为我工作。

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.

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

对我来说应该是__loader__.name。参见docs.python.org/3/library/…上的文档。

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

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

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

_如果使用"-m"标志调用,则名称_uuuu将是"main"。

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

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

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

谢谢,我编辑了我的问题,指定我知道如何操作以得到答案,我希望找到一种更简单的方法,而不必亲自验证它。

你是说sys.argv[0]。

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

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

我仍然在使用一个仍然使用getopt的公司包。模块创建于2006-2007年?

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

该包装包含的:小的CAN

1

2import sys

__import__(sys.argv[1])

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

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

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

我改变了公司的政策,停止将脚本放在/usr/local/bin中,因为这些脚本很难清理,或者很难找到谁来自哪个项目。所以我们现在将实用程序脚本保存在它们自己的包中。

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

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

1

2

3

4

5Class 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

4MacBook-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进口。

这违背了我的需要。硬编码的问题总是,如果我更改了文件名,我需要记住更改帮助文本。

如果更改文件名,所有导入都将中断,因此帮助文本是问题中较小的一个。

脚本是入口点,其他模块不导入它,因此此问题不适用。

这与你最初的问题相矛盾,事实上,如果是这样的话,__name__ =="__main__"还是正常工作的。

很抱歉不同意。我不知道更改当前文件的名称将如何破坏其中的导入。我已经开发了5年,更改入口点(脚本)的名称从未破坏其中的任何导入。如果你有一个具体的例子,请启发我。如果你说的是"相对"进口,我永远不会使用它们。

如果你有理由的话,可以不同意,这里的问题是,入口点不是(通常)导入的,而是执行的,因此在这种情况下并不重要,但这里你谈论的是导入,所以这是另一回事,没有意义的是,你导入入口点,这就是矛盾。

实际上,您是第一个提到导入的人:"如果更改文件名,所有导入都将中断"。

是的,因为更改您执行的文件的名称并不重要,您不需要知道"a.b.c"是否是入口点,因为您不需要du'python-m a.b.c'您需要'python file name'

但这就是我的全部观点,为什么用"python-m a.b.c"而不是"python文件"?我一点都不在乎,所以如果你胡说八道,我会打电话给你,我不在乎我是否回答你的问题,真正的答案是"你做错了"。

这是你的意见。我使用的是"python-m a.b.c",因为我想安装脚本和我的python模块。我不想污染/usr/local/bin或任何virtualenv/bin。这样做,我通过在错误的Python环境中使用错误的模块来保护自己。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值