首页 > 解决方案 > 检查当前 python 代码是否从包中运行

问题描述

是否可以检测当前的 python 代码是否从包中运行?

如果是 - 是否可以获得包元数据(名称、版本、描述)?


包是用这种创建的setup.py

import os
from setuptools import setup, find_packages
setup(
    name='my-pack-name',
    description='my description ' + os.getenv('GIT_COMMIT', '*')[:7],
    version=os.getenv('BUILD_VERSION', '0.0.0dev'),
    packages=find_packages(),
)

建造:python3 setup.py bdist_wheel -d ./artifact

安装在目标上:pip3 install "my-pack-name-x.x.x.whl" --upgrade

现在从my_pack_name/app.py里面my-pack-name-x.x.x.whl我想检测到我正在从已安装的包中运行

如果是,则获取在setup.py执行期间定义的包元数据

标签: pythonpython-3.x

解决方案


对于 Python >=3.8

https://docs.python.org/es/3.10/library/importlib.metadata.html

您可以通过以下方式获取包的元数据:

from importlib.metadata import metadata

md = metadata("your package name")
author = md["Author"]
# etc ...

对于 Python <3.8

这只是一个想法(未经测试)。

将包元数据放在不同的模块中,然后尝试在 app.py 模块中相对导入它呢?

# metadata.py
name='my-pack-name',
description='my description ' + os.getenv('GIT_COMMIT', '*')[:7],
version=os.getenv('BUILD_VERSION', '0.0.0dev')

在 setup.py 你可以重用它:

# setup.py
import os
from setuptools import setup, find_packages
import .metadata as md
setup(
    name=md.name,
    description=md.description + os.getenv('GIT_COMMIT', '*')[:7],
    version=md.version,
    packages=find_packages(),
)

而在 app.py

def get_metadata():
    try:
        import .metadata as md
    except ImportError:
        return None
    else:
        # return metadata here

这样,如果get_metadata返回 None,您将无法导入模块,因此您没有在包中执行 app.py,否则,您在包中,并且作为奖励,您获得了元数据。


推荐阅读