python - 检查当前 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
执行期间定义的包元数据
解决方案
对于 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,否则,您在包中,并且作为奖励,您获得了元数据。
推荐阅读
- ios - iOS 13 UserDefaults:在某些设备上启动时应用程序崩溃
- windows - 有时工作流实例会被自动删除而没有完全执行
- java - Vert.X SLF4J 日志记录
- javascript - 如何在javascript中创建电梯程序
- java - 设置@WebInitParam 动态值
- loops - 使用 Symfony 4 用树枝循环
- python - 迭代和连接两个不同长度的列表,同时排除关键字
- python - 检测 Pandas Dataframe 中的浮点值
- angularjs - 通过将文本作为键传递来使用角度翻译
- arrays - 如何在 Julia 中不同类型的多维数组之间进行转换