python导入yaml -但是是哪一个呢?

s4n0splo  于 2023-01-16  发布在  Python
关注(0)|答案(5)|浏览(165)

你克隆了一个回购协议有一个导入
import yaml
好的,那么你做pip install yaml得到:

    • 一米二米一x**

好吧,那么您要查找一个包含yaml的包,并且有无数个这样的包...通常在前面添加py就可以完成任务,但是...
我怎么知道是哪一个?!
它不仅仅是yaml,哦不...还有:
import cv2 # python-opencv
import PIL # Pillow
名单还在继续...
我怎样才能知道哪个导入使用哪个包?不是应该有一个PEP吗?或者有一个命名约定,比如导入总是和包名一样吗?
有一个类似的主题here,如果你还不够沮丧的话:)

mw3dktmi

mw3dktmi1#

[When I clone a repo,]如何知道哪个导入使用哪个包?
简而言之:解释这一点是克隆代码的责任,克隆代码包含一个安装程序来处理它是一种期望的礼貌。
如果这只是某个人在GitHub上随意捆绑的.py文件,没有安装说明,请在相关文档中查找注解;如果做不到这一点,就在追踪器上做一个问题。(或者干脆给予。也许寻找一个更好的工程项目来做同样的事情。)
但是,大多数“严肃的”、当代的Python项目都是要通过使用某种形式的打包系统来安装的,这些都是经过多年的演变,最佳实践也发生了多次变化;但一般来说,一个正确“打包”和“分发”的项目将具有setup.py或(更新;在许多方面更好,但还没有被普遍采用)pyproject.toml文件在顶层。
pyproject.toml文件是TOML的配置文件,它简单地描述了一堆项目元数据,这需要符合PEP 517的构建后端,有一段时间,这需要第三方工具,比如Poetry;但是标准setuptools从版本40.8.0开始就可以处理这个问题(在撰写本文时,当前版本是65.7.0)。
setup.py脚本是pip从PyPI(或其他软件包索引)下载软件包后调用的可执行代码。通常,此脚本将使用setuptoolsdistutilssetuptools的前身;它最终在Python 3.10中被正式弃用,并将在Python 3.12中被删除)来安装项目,方法是调用一个名为setup的函数,并向其传递一个带有一些项目元数据的大dict。

安全警告:此文件仍然是可执行代码。它是任意代码,不需要遵循标准约定。此外,实际从PyPI下载的包不一定与GitHub(或其他Git供应网站)上显示的项目源代码匹配(如果有的话)。(此问题也会影响其他语言和生态系统中的包管理器,特别是npm for Javascript。)

在基于setup.py的方法中,包依赖关系是通过setup函数的关键字参数来指定的。目前,仍然使用setup.py的项目应该使用install_requires关键字参数。
对于基于pyproject.toml的方法,使用setuptools的后端,依赖项将是存储在project.dependencies下的数组(使用JSON术语,因为TOML是超集)。例如,Poetry期望tool.poetry.dependencies下的该信息。
在任何情况下,pip freeze都将输出当前环境中安装的列表。开发人员通常会在安装了依赖项的虚拟环境中测试代码,将输出转储到requirements.txt文件中,并将其作为文档包含在内。
[When我想在自己的代码中使用第三方库,]如何知道哪个导入使用哪个包?
反过来考虑这个问题也是值得的:假设我们已经使用pip install opencv-python安装了OpenCV for Python,并且希望在我们自己的代码中使用它,那么我们如何具体了解import cv2呢?
答案是:没有约定,当然也不要求安装的包名与PyPI名匹配,也不要求与GitHub等仓库名匹配。阅读文档.每个打算将自己的代码用作库的人,都非常愿意展示如何使用,至少在基本层面上是这样。

d5vmydt9

d5vmydt92#

注意requirements.txt。大项目通常都有它。你可以从这个文件导入包。否则就用google.

tyu7yeag

tyu7yeag3#

请记住,它可能不是一个PIP包。
可能发生的情况是主脚本试图导入一个辅助脚本(在本例中为yaml.py),其中包含供主脚本使用的函数或实用程序。
检查repo是否包含名为yaml.py的文件,如果是,请确保在yaml.py位于同一目录时运行主脚本。
另外,检查requirements.txt文件。
您可以在shell中运行的文件中安装所有要求,如下所示:

pip install -r *path to your requirements.txt*

希望这能有所帮助。

f2uvfpb9

f2uvfpb94#

PyPI上的任何软件包或者从某个在线仓库克隆的软件包都可以自由地设置自己的基本目录名,基本目录xyz决定了import xyz行,另外PyPI上的软件包名称不必与保存其源代码修订版本的仓库名匹配(假设有)。
这样做的缺点是软件包名、repo和/或导入行之间没有一一对应的关系,但好处是你可以安装Pillow,它向后兼容PIL,并且仍然使用import PIL,而不是将所有源代码都改为使用import Pillow as PIL
如果你克隆的repo有requirements.txt,你也可以在setup.py中查找extra_require,但是不能保证这些是可用的,或者包含要安装的包的名称(例如,我使用了一个通用的setup.py,当创建/安装一个包时,它从__init__.py文件中的数据结构读取它的信息)。
yaml似乎是PyPI上的一个保留名称(至少在几年前我试图上传一个包时是这样),所以这可能是这个包命名为PyYAML的原因,尽管Py并不是很有用,因为python代码在另一种编程语言中将无法运行。PyPI的搜索不是很有帮助,因为它的相关性排序是不相关的(至少对yaml来说不是)。
PyPI在import line的元数据中没有条目,但是你可以从.whl包文件中提取,因为导入行是顶层目录,与.dist-info不匹配。这通常不可能从.tar.gz '包文件中提取。我不知道有任何网站做这种自动抓取。
搜索完导入术语后,您可以点击PyPI上的包,并希望您能找到与文档中的导入匹配的包,但这并不能保证您找到了正确的包。
您最好在stackoverflow上搜索import yaml,并希望问题或答案提到包名。

qyyhg6bp

qyyhg6bp5#

非常感谢您的帮助和想法。非常感谢Karl Knechter的详尽回答。
tl;dr:我认为使用某种“包”/“分发”作为标准,会让每个人的生活都更轻松。
然而,我的问题是半理论性的,指出了我称之为Python中的不一致性。你当然是对的,应该有setuptoolsrequirements.txt,或者至少有一些文档。但是,如果没有,我们很容易出错或额外浏览。
GospelBG指出了一些重要的东西,主文件夹中可能有一个脚本yaml.py,我们需要检查和/或猜测。
最重要的是,命名导入和包是完全不同的。应该有一个命名约定或PEP。同样,你当然可以最终得到正确的包等等,但它不是显式和明显的,它应该是!因为在编程中,我们喜欢这样,不是吗?
我对Python不是经验丰富的开发人员,我正在学习C++,但是例如在C++中,你用一个特定的名字导入一个头文件,然后用文件名导入静态或动态库。现在我知道这是一个非常“按部就班,步行的方法”,但是至少你使用了确切的文件名。
在上层你有CMake,它是setuptools的等价物,使用find_packagefind_library你可以导入包/库.老实说,我不确定是否所有的包都有完全等价的名称,但至少我使用的包是匹配的.
再次感谢您的帮助和回答!我欢迎讨论和评论:)

相关问题