我有一个项目要结构如下:
myproject
__init__.py
api
__init__.py
api.py
backend
__init__.py
backend.py
models
__init__.py
some_model.py
Run Code Online (Sandbox Code Playgroud)
现在,我想同时在api.py和backend.py中导入some_model.py模块。如何正确执行此操作?我试过了
from models import some_model
Run Code Online (Sandbox Code Playgroud)
但是失败并显示为“ ModuleNotFoundError:没有名为'models'的模块”。我也试过
from ..models import some_model
Run Code Online (Sandbox Code Playgroud)
然后给我“ ValueError:尝试相对顶级包进行相对导入”。我在这里做错了什么?如何从其他目录(不是子目录)导入文件?
我有一个庞大的Python 3.7+项目,目前正在将其拆分为多个可以单独安装的软件包。我最初的想法是拥有一个包含多个软件包的Git存储库,每个软件包都有自己的setup.py。但是,当在Google上进行一些研究时,我发现人们建议每个软件包一个存储库:(例如,Python-setuptools-处理两个相关的软件包(在一个仓库中?))。但是,没有人提供为什么他们喜欢这种结构的很好的解释。
因此,我的问题如下:
另外,我知道(如果我错了,请纠正我),即使setup.py的GitHub URL不在存储库的根目录下,setuptools现在也允许从GitHub存储库安装依赖项。
我正在制作一个包,这个包中的模块在if __name__=='__main__':块中包含用于测试目的的代码。但是我尝试在这些模块中使用相对导入会导致错误。
我已经阅读了这个帖子和其他十亿人: 第 10 亿次的相对进口
在将其标记为重复之前,如果我想做的事情在 Python3 中是不可能的,那么我的问题是为什么它可以在 Python2 中工作,以及是什么促使决定在 Python3 中如此麻烦?
这是我的示例 Python 项目:
mypackage
- module1.py
- module2.py
- __init__.py
Run Code Online (Sandbox Code Playgroud)
__init__.py并且module2.py是空的
module1.py 包含:
import module2
# module1 contents
if __name__=="__main__":
# Some test cases for the contents of this module
pass
Run Code Online (Sandbox Code Playgroud)
这在 Python2 中工作正常。我可以从我计算机上任何位置的其他项目导入 module1,我也可以直接运行 module1 并if运行块中的代码。
但是,这种结构在 Python3 中不起作用。如果我尝试在其他地方导入模块,它会失败:
>>> from mypackage import module1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\_MyFiles\Programming\Python Modules\mypackage\module1.py", line …Run Code Online (Sandbox Code Playgroud) python relative-path python-import python-3.x python-packaging
这是我的目录结构,
??? test
? ??? test.f90
? ??? __init__.py
? ??? test.py
Run Code Online (Sandbox Code Playgroud)
现在我想用命令行工具制作一个包test。现在我有两个选择,1. numpy distutils 和 2. setuptools。
问题distutils在于它不支持入口点,现在也不推荐使用。但它确实完美地编译了 fortran 代码。现在对于 setuptools 我正在尝试使用此代码,
mod = Extension(name = 'foo.adt', sources = ['test/test.f90'])
setup(
name = 'foo',
packages = ['foo'],
package_dir = {'foo':'test'},
ext_modules = [mod],
entry_points={
'console_scripts': [
'hello = foo.test:main',
],
}
)
Run Code Online (Sandbox Code Playgroud)
如果我尝试使用它,则会抛出此错误
error: unknown file type '.f90' (from 'test/test.f90')
Run Code Online (Sandbox Code Playgroud)
所以,我猜 setuptools 不支持 fortran 文件?那么,如何编译 fortran 代码、创建包并为其创建入口点?
我上传了一个包到 pypi.org,但我的 RST README 格式不正确。
这是 GitHub 上的样子:https : //github.com/NinjaSnail1080/akinator.py
这是 PyPi 上的样子:https ://pypi.org/project/akinator.py/
出于某种原因,在 GitHub 上一切都被正确格式化,但在 PyPi 上,它根本没有被格式化。它没有显示在 RST 中格式化的 README,它只是一堆未格式化的文本。
我尝试python3 -m twine check dist/*在我的项目上运行并得到这个:
Checking distribution dist/akinator.py-1.0.3.dev3-py3-none-any.whl: warning: `long_description_content_type` missing. defaulting to `text/x-rst`.
Failed
The project's long_description has invalid markup which will not be rendered on PyPI. The following syntax errors were detected:
line 26: Error: Unexpected indentation.
Checking distribution dist/akinator.py-1.0.3.dev3.tar.gz: warning: `long_description_content_type` missing. defaulting to `text/x-rst`.
Failed
The project's long_description has invalid …Run Code Online (Sandbox Code Playgroud) 我需要将一个包写入存储库,但它是一个小型快速包,因此我认为不需要将文件放入子目录中。我只是想要:
import mypkg.module1
Run Code Online (Sandbox Code Playgroud)
具有目录结构
root_folder/
- setup.py
- __init__.py # the init for package "mypkg" (empty)
- module1.py
Run Code Online (Sandbox Code Playgroud)
我不想被限制增加文件夹层次结构,如下所示:
root_folder/
- setup.py
- __init__.py # the init for package "mypkg" (empty)
- module1.py
Run Code Online (Sandbox Code Playgroud)
root_folder/
- setup.py
- mypkg/ # WHY would I do that for 1 module??
- __init__.py
- module1.py
Run Code Online (Sandbox Code Playgroud)
但结果是,import mypkg失败了,并且import module1工作了,而不是期望的import mypkg.module1。
我发现了这个问题,但“只需将 setup.py 向上移动一个文件夹”的答案不适合我。
在此处找到设置参数文档后,我尝试定义一个命名空间包:
# Content of setup.py
from setuptools import setup
setup(name='MyPkg',
packages=['mypkg'] …Run Code Online (Sandbox Code Playgroud) 使用Artifactory(https://cloud.google.com/artifact-registry)我打算添加对诗歌的依赖(https://python-poetry.org/docs/repositories/)。
我可以使用命令安装:(pip install --index-url https://us-central1-python.pkg.dev/<PROJECT_ID>/<SOME_LIB_REPO>/simple/ <PACKAGE_NAME>使用 keyrings.google-artifactregistry-auth 进行身份验证)
我打算使用 POETRY 来管理我的依赖项。我不知道使用诗歌是否会增加这种依赖性。poetry add --source <PACKAGE_NAME> https://us-central1-python.pkg.dev/<PROJECT_ID>/<SOME_LIB_REPO>我收到此错误:
poetry update
Updating dependencies
Resolving dependencies... (0.9s)
RepositoryError
401 Client Error: Unauthorized for url: https://us-central1-python.pkg.dev/<PROJECT_ID>/<SOME_LIB_REPO>/simple/pytest/
Run Code Online (Sandbox Code Playgroud)
我的 pyproject.toml
...
[[tool.poetry.source]]
name = "SOME_LIB"
url = " https://us-central1-python.pkg.dev/<PROJECT_ID>/<SOME_LIB_REPO>/simple/"
secondary = true
Run Code Online (Sandbox Code Playgroud)
这里有如何使用 PIP/VIRTUALENV 进行配置的详细信息:https://cloud.google.com/artifact-registry/docs/python/authentication但没有有关 Poetry 的详细信息。
您对此有什么建议吗?
python python-packaging python-poetry google-artifact-registry
我有一个像这样的 setup.py :
#!/usr/bin/env python
from setuptools import setup, find_packages
setup(
name="myproject",
package_dir={"": "src"},
packages=find_packages("src"),
entry_points={
"console_scripts": [
"my-script = myproject.myscript:entrypoint",
],
},
)
Run Code Online (Sandbox Code Playgroud)
如何entry_points使用 setuptools 在 pyproject.toml 中编写该配置?
我猜测类似这样的事情,继续setuptools 的 pyproject.toml 文档,它说我需要在引用入口点的文档之后使用“INI 格式” ,但它似乎没有给出示例,我的猜测关于如何将 setuptools 语法与 pyproject.toml 语法结合起来是错误的(我从pip install -e .该报告中得到了回溯pip._vendor.tomli.TOMLDecodeError: Invalid value,指向entry-pointspyproject.toml 中的行):
[build-system]
requires = ["setuptools", "setuptools-scm"]
build-backend = "setuptools.build_meta"
[metadata]
name = "myproject"
[tool.setuptools]
package-dir = {"" = "src"}
[tool.setuptools.packages.find]
where = ["src"]
[tool.setuptools.dynamic]
entry-points …Run Code Online (Sandbox Code Playgroud) python program-entry-point setuptools python-packaging pyproject.toml
我使用 conda 使用 python 3.10.9 创建一个新环境。我使用 pip 安装了诗歌,在添加几个包后,该poetry add pkg命令不起作用并出现错误消息:
HTTPResponse.__init__() got an unexpected keyword argument 'strict'
Run Code Online (Sandbox Code Playgroud)
我用谷歌搜索了这个问题,但没有答案,如何解决?
让诗歌添加命令正常工作
python ×10
python-packaging ×10
setuptools ×4
python-3.x ×3
github ×1
install ×1
numpy ×1
package ×1
pypi ×1
setup.py ×1
twine ×1
windows ×1