如何获取当前最顶层的包,即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) 是否可以将蛋糕减半并吃掉它:可以安装(通过某种机制)具有以下结构的项目:
pyproject.toml
setup.cfg
src/...
scripts/...
Run Code Online (Sandbox Code Playgroud)
在可编辑模式下,就像使用标准setup.py项目一样:
python3 -m pip install -e .
Run Code Online (Sandbox Code Playgroud)
(如果答案是:“ one does not install pyproj.toml packages in editable mode ”也可以)
我只想要这样的诗歌:
$ pip install pydantic[email]
Run Code Online (Sandbox Code Playgroud)
我已阅读所有相关帖子。现在我的pyproject.toml看起来像这样(我也尝试了其他所有方法):
[tool.poetry.dependencies]
pydantic = {version = "*", optional = true, extras = ["email"]}
...
[tool.poetry.extras]
email = ["pydantic"]
Run Code Online (Sandbox Code Playgroud)
我还删除了.venv,poetry.lock然后$ poetry install。没有用。运行时错误很明显:
ImportError: email-validator is not installed, run `pip install pydantic[email]`
Run Code Online (Sandbox Code Playgroud)
我可以添加一个细节:它本身就是一种依赖项(在我遇到这个问题之前pydantic它是不存在的)。pyproject.toml
当你有一个setup.py文件时,你可以通过以下命令获取包的名称:
C:\some\dir>python setup.py --name
Run Code Online (Sandbox Code Playgroud)
这会将包的名称打印到命令行。
为了遵循最佳实践,我试图setup.py通过将所有内容放入其中来迁移setup.cfg,因为以前的所有内容setup.py都是静态内容。
但我们的构建管道依赖于能够调用python setup.py --name. 我希望以不需要创建setup.py文件的方式重写管道。
setup.cfg当您有文件但没有文件时,有没有办法获取包的名称setup.py?
我试图在命令下运行,但它在我的 Windows 机器上不起作用。
C:\Users\XXX\Desktop\python-7>pip install chalice -t .
ERROR: Can not combine '--user' and '--target'
C:\Users\XXX\Desktop\python-7>pip install --user --install-option="--prefix=" chalice -t .
ERROR: Can not combine '--user' and '--target'
Run Code Online (Sandbox Code Playgroud)
有人可以让我知道是否有其他方法可以将模块放在同一目录中吗?
C:\Users\XXX\Desktop\python-7>pip install --target=C:\Users\XXX\Desktop\python-7 chalice
ERROR: Can not combine '--user' and '--target'
Run Code Online (Sandbox Code Playgroud) 我一直在使用 pudb 来调试 python 代码,它非常直接进入终端。但我一点也不喜欢它的颜色。
如下图所示。
我在文件夹里面找到了
.local/lib/python3.8/site-packages/pudb
Run Code Online (Sandbox Code Playgroud)
文件名theme.py但即使尝试更改它也没有任何反应

用于为包注册表打包 Python 项目的 GitLab 说明指示用户创建包含以下内容的 pyproject.toml 文件:
[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"
[project]
name = "mypypipackage"
version = "0.0.1"
authors = [
{ name="Example Author", email="author@example.com" },
]
description = "A small example package"
requires-python = ">=3.7"
classifiers = [
"Programming Language :: Python :: 3",
"Operating System :: OS Independent",
]
[tool.setuptools.packages]
find = {}
Run Code Online (Sandbox Code Playgroud)
find = {}谁能解释一下底部的功能是什么?GitLab 指南没有解释,我似乎找不到任何相关文档。
当然,.toml 文件按照指示工作得很好,但在不[tool.setuptools.packages]完全包含该部分的情况下它似乎也工作得很好。
我有一个 Python3 Poetry 项目,其中有一个pyproject.toml指定依赖项的文件:
[tool.poetry.dependencies]
python = "^3.10"
nltk = "^3.7"
numpy = "^1.23.4"
scipy = "^1.9.3"
scikit-learn = "^1.1.3"
joblib = "^1.2.0"
[tool.poetry.dev-dependencies]
pytest = "^5.2"
Run Code Online (Sandbox Code Playgroud)
我requirements.txt使用命令将这些依赖项导出到文件中poetry export --without-hashes -f requirements.txt --output requirements.txt,生成以下文件requirements.txt:
click==8.1.3 ; python_version >= "3.10" and python_version < "4.0"
colorama==0.4.6 ; python_version >= "3.10" and python_version < "4.0" and platform_system == "Windows"
joblib==1.2.0 ; python_version >= "3.10" and python_version < "4.0"
nltk==3.8.1 ; python_version >= "3.10" and python_version …Run Code Online (Sandbox Code Playgroud) ch_news_dev_python | Warning: 'news' is an entry point defined in pyproject.toml, but it's not installed as a script. You may get improper `sys.argv[0]`.\nch_news_dev_python | \nch_news_dev_python | The support to run uninstalled scripts will be removed in a future release.\nch_news_dev_python | \nch_news_dev_python | Run `poetry install` to resolve and get rid of this message.\nRun Code Online (Sandbox Code Playgroud)\n我的项目结构
\nnews\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 docker\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 development\n\xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ...\n\xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 python_server\n\xe2\x94\x82 \xe2\x94\x82 …Run Code Online (Sandbox Code Playgroud) python ×7
setuptools ×4
pip ×3
debugging ×1
docker ×1
dockerfile ×1
pep517 ×1
pudb ×1
pypi ×1
setup.py ×1