gpt4 book ai didi

python - 如何获取当前的 'package' 名称? (设置.py)

转载 作者:行者123 更新时间:2023-12-03 13:37:39 47 4
gpt4 key购买 nike

如何获取当前最顶层的包,即 setup.py 中定义的名称?

这是我的tree :

.
|-- README.md
|-- the_project_name_for_this_pkg
| |-- __init__.py
| |-- __main__.py
| |-- _config
| | `-- foo.conf
| |-- _data
| | `-- logging.yml
| `-- tests
| |-- __init__.py
| `-- test_foo.py <--- # executing from here
|-- requirements.txt
`-- setup.py

4 directories, 9 files

到目前为止,我已经开始工作的唯一解决方案是:
import os
import sys


os.path.basename(sys.path[1])

但这显然是一个糟糕的解决方案。其他解决方案,例如拥有 __name__在我的最上面 __init__.py文件并使用 ast.parse 阅读 setup.py 的相关部分也显得繁琐。

我尝试过的其他解决方案——通过在 unittest.TestCase 中调用它们继承 class在我的 tests python [子]包——包括检查 sys.modules[__name__] , inspect.getmodule & inspect.stack ,以及这些问题的答案:
  • Python - Get path of root project structure
  • Get full package module name
  • Get fully qualified class name of an object in Python
  • How can I access the current executing module or class name in Python?
  • Get full caller name (package.module.function) (Python recipe)
  • https://docs.python.org/2/library/modulefinder.html

  • 顺便说一句:如果你想知道为什么我想要包名……这样我就可以运行如下的东西:
    import pkg_resources


    version = pkg_resources.require('the_project_name_for_this_pkg')[0].version
    data_file = path.join(resource_filename('the_project_name_for_this_pkg', '__init__.py'),
    '_config', 'data_file.txt')

    最佳答案

    不完全确定更大的目标是什么,但也许您可能有兴趣阅读 importlib.resources 以及 importlib.metadata .
    类似于以下内容:

    import importlib.metadata
    import importlib.resources

    version = importlib.metadata.version('SomeProject')
    data = importlib.resources.files('top_level_package.sub_package').joinpath('file.txt').read_text()
    更一般地说,几乎不可能(或不值得大量工作)从代码中 100% 可靠地检测项目名称 ( SomeProject)。硬编码更容易。
    尽管如此,这里有一些技术和想法,可以从其模块之一中检索项目名称:
  • https://bitbucket.org/pypa/distlib/issues/102/getting-the-distribution-that-a-module
  • https://stackoverflow.com/a/22845276/11138259
  • https://stackoverflow.com/a/56032725/11138259

  • 更新 :
    我相信像下面这样的一些函数应该返回包含当前文件的已安装发行版的名称:
    import pathlib
    import importlib_metadata

    def get_project_name():
    for dist in importlib_metadata.distributions():
    try:
    relative = pathlib.Path(__file__).relative_to(dist.locate_file(''))
    except ValueError:
    pass
    else:
    if relative in dist.files:
    return dist.metadata['Name']
    return None

    更新 (2021 年 2 月):
    由于新添加的 packages_distributions(),看起来这可能会变得更容易。 importlib_metadata中的函数:
  • https://importlib-metadata.readthedocs.io/en/stable/using.html#package-distributions
  • https://github.com/python/importlib_metadata/pull/287/files
  • 关于python - 如何获取当前的 'package' 名称? (设置.py),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60351184/

    47 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com