什么是__init__.py一个Python源目录?
任何人都可以解释,setup.py它是什么以及如何配置或使用?
自 2022 年中期以来,现在可以取消setup.py,setup.cfg转而使用pyproject.toml. 可编辑安装适用于最新版本的 setuptools 和 pip,甚至官方打包教程setup.py也从pyproject.toml.
然而,有关的文档requirements.txt似乎也已被删除,我想知道现在将固定的需求放在哪里?
回顾一下:过去的常见做法是放置依赖项(没有版本固定),以setup.py避免当此包与需要相同依赖项但版本要求冲突的其他包一起安装时出现问题。对于打包库来说, asetup.py通常就足够了。
对于部署(即非库),您通常还提供requirements.txt版本固定的依赖项。因此,您不会意外地获得该包经过测试的最新、最好的依赖项版本。
所以我的问题是,有什么改变吗?requirements.txt当与 一起使用时,您仍然将固定的需求放在其中吗pyproject.toml?或者有一个额外的部分pyproject.toml吗?某处有相关文档吗?
在下载的时候pip install allennlp==1.0.0 allennlp-models==1.0.0,我遇到了这样的问题:
[6 lines of output]\n running bdist_wheel\n running build\n running build_py\n running build_ext\n building \'srsly.msgpack._unpacker\' extension\n error: Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft C++ Build Tools": https://visualstudio.microsoft.com/visual-cpp-build-tools/\n [end of output]\n\n note: This error originates from a subprocess, and is likely not a problem with pip.\n ERROR: Failed building wheel for srsly\n Failed to build thinc blis srsly\n ERROR: Could not build wheels for srsly, which is required to …Run Code Online (Sandbox Code Playgroud) 我们有多个 python 项目,正在考虑将它们转换为使用pyproject.toml而不是setup.py.
有没有一种简单的方法可以自动执行此操作?
我有一个Python模块,它使用模块目录的子目录中的一些资源.在搜索堆栈溢出并找到相关答案后,我设法通过使用类似的东西将模块引导到资源
import os
os.path.join(os.path.dirname(__file__), 'fonts/myfont.ttf')
Run Code Online (Sandbox Code Playgroud)
当我从其他地方调用模块时这很好用,但是当我在更改当前工作目录后调用模块时,它会中断.问题是内容__file__是一个相对路径,没有考虑到我更改目录的事实:
>>> mymodule.__file__
'mymodule/__init__.pyc'
>>> os.chdir('..')
>>> mymodule.__file__
'mymodule/__init__.pyc'
Run Code Online (Sandbox Code Playgroud)
如何__file__编写绝对路径,或者禁止如何访问模块中的资源,无论当前工作目录是什么?谢谢!
嘿所有 - 我用Python中的相对导入拉出我的头发.我已经阅读了30次文档和SO和其他论坛上的大量帖子 - 似乎仍然没有用.
我的目录结构目前看起来像这样
src/
__init__.py
main.py
components/
__init__.py
expander.py
language_id.py
utilities/
__init__.py
functions.py
Run Code Online (Sandbox Code Playgroud)
我希望expandder.py和language_id.py可以访问函数模块.我运行python main.py,它可以从components.expander import*和components.language_id import*访问模块.
但是,在expandder和language_id中的代码访问函数模块:
from ..utilities.functions import *
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
ValueError: Attempted relative import beyond toplevel package
Run Code Online (Sandbox Code Playgroud)
我已经过了很多次,它似乎遵循文档.任何人都对这里出了什么问题有任何想法?
我想为 CPython 构建一个 C 扩展。我可以按照传统方式使用setup.py文件来完成此操作。然而,由于 PEP 517 中提到的原因,我更喜欢使用pyproject.toml. 据我所知,这setuptools是唯一可以在所有相关平台上构建 C 扩展的构建后端。事实上,我不知道有任何后端能够与过时的distutils.
在此背景下,常见的情况setup.py如下所示:
from setuptools import setup, Extension
kwargs = dict(
name='mypackage',
# more metadata
ext_modules=[
Extension('mypackage.mymodule', ['lib/mymodule.c',
'lib/mypackage.c',
'lib/myalloc.c'],
include_dirs=['lib'],
py_limited_api=True)])
setup(**kwargs)
Run Code Online (Sandbox Code Playgroud)
现在,挑战是将以上内容放入 a pyproject.tomlplus a中setup.cfg。
文档setuptools建议pyproject.toml如下:
[build-system]
requires = [
"setuptools >=52.0",
'wheel >= 0.36']
build-backend = "setuptools.build_meta"
Run Code Online (Sandbox Code Playgroud)
看
此外,实际的元数据应该进入setup.cfg. 但是,我还没有找到任何关于如何将ext_moduleskwarg(特别Extension()是调用)转换为setup.cfg语法的解释。
我搜索了一下但找不到明确的答案。
目标是拥有两个点指数,一个是私有指数,这将是首要任务。其中之一是标准 PyPI。首要任务是防止代码注入的安全风险。
假设我有一个名为 的库lib,并且我配置index_url = http://my_private_pypi_repo并extra_index_url = https://pypi.org/simple
如果 I pip install lib、 和 都lib存在于两个索引中。什么索引会优先?将从哪里安装?
另外,如果pip install lib=0.0.2我的私有索引中存在 0.0.1 版本的 lib。它也会考虑 PyPI 吗?
什么是控制的好方法,某些库仅从私有索引中获取(如果它们存在),并且不会在 PyPI 中查找?
stuff/
__init__.py
mylib.py
Foo/
__init__.py
main.py
foo/
__init__.py
script.py
Run Code Online (Sandbox Code Playgroud)
script.py 想要导入 mylib.py
这只是一个例子,但实际上我只是想在父目录中进行模块的相对导入.我尝试过各种各样的东西并得到这个错误......
Attempted relative import beyond toplevel package
我在某处读到程序启动的脚本不应该在包中,我尝试修改结构就像这样......
stuff/
mylib.py
foo.py // equivalent of main.py in above
foo/
__init__.py
script.py
Run Code Online (Sandbox Code Playgroud)
但得到了同样的错误.
我怎么能做到这一点?这甚至是一种适当的方法吗?
编辑:在Python 2中
python-packaging ×10
python ×8
setup.py ×3
pip ×2
pypi ×2
setuptools ×2
allennlp ×1
module ×1
package ×1
python-2.x ×1
python-3.x ×1