如何获取当前最顶层的包,即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
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已经开始工作的唯一解决方案是:
import os
import sys
os.path.basename(sys.path[1])
Run Code Online (Sandbox Code Playgroud)
但这显然是一个糟糕的解决方案。其他解决方案,例如__name__在我最上层的__init__.py文件中使用a并ast.parse用于阅读 的相关部分setup.py也似乎很麻烦。
我尝试过的其他解决方案 - 通过在我的python [子] 包中的unittest.TestCase继承class中调用它们tests- 包括检查 …
不要感到困惑,有大量关于安装 Python 包、如何导入生成的模块以及列出可用包的问题。但是,如果您没有pip--what-provides样式文件或Pipenv Pipfile ,则似乎没有与 pip 等效的选项。此问题与上一个问题类似,但要求提供父包,而不是其他元数据。也就是说,这些其他问题没有得到很多关注或得到许多接受的答案 - 例如。如何查找给定模块的 python 包元数据信息。就这样砥砺前行……requirements.txt
举例来说,有两个包(仅举几例)将安装名为的模块serial- 即pyserial和serial。因此,假设安装了其中一个软件包,我们可以使用 pip list 找到它:
python3 -m pip list | grep serial
Run Code Online (Sandbox Code Playgroud)
但是,如果包的名称与模块的名称不匹配,或者您只是想找出要安装的包(在旧服务器或开发计算机上工作),就会出现问题。
您可以检查导入模块的路径 - 这可以给您提供线索。但继续这个例子......
>>> import serial
>>> print(serial.__file__)
/usr/lib/python3.6/site-packages/serial/__init__.py
Run Code Online (Sandbox Code Playgroud)
它位于一个serial目录中,但实际上只安装了pyserial ,而不是serial:
>>> import serial
>>> print(serial.__file__)
/usr/lib/python3.6/site-packages/serial/__init__.py
Run Code Online (Sandbox Code Playgroud)
我能想到的最接近的是生成一个可能在依赖子文件上失败的requirements.txtvia (就像我所做的那样),或者通过Pipenvpipreqs ./反向检查依赖关系(这会带来一整套新问题来完成所有设置):
> python3 -m pip list | grep serial
pyserial …Run Code Online (Sandbox Code Playgroud)