标签: python-packaging

Python - 导入包失败

我在导入包时遇到问题。我的文件结构是这样的:

filelib/  
    __init__.py
    converters/ 
        __init__.py
        cmp2locus.py
    modelmaker/ 
        __init__.py
        command_file.py
Run Code Online (Sandbox Code Playgroud)

在模块中command_file.py,我有一个名为CommandFile我想在其中调用的类cmp2locus.py模块中调用的类。

我在模块中尝试了以下操作cmp2locus.py

import filelib.modelmaker.command_file
import modelmaker.command_file
from filelib.modelmaker.command_file import CommandFile
Run Code Online (Sandbox Code Playgroud)

所有这些选项都会返回ImportError: No modules named ... 感谢任何有关解决此问题的提示。我不明白为什么这个导入不起作用。

python python-module python-import python-packaging

3
推荐指数
1
解决办法
2万
查看次数

如何确定 PyPI 包中可用的模块

给定一个 PyPI 包名称,例如PyYAML,如何以编程方式确定包(分发包)中可以导入的可用模块?

细节

我对此并不是特别感兴趣PyYAML,它只是一个流行的 PyPI 包的一个很好的例子,它的包名称 ( PyYAML) 与其主模块名称 ( yaml) 不同,这样你就不能轻易地从包名称中猜出模块名称。

我见过其他听起来像这样但不同的问题的答案,可能是因为命名冲突

  • package表示允许模块集合的 python 结构
  • package的意思是“分发包”,是一个包含 Python 包、模块和其他用于分发版本的资源文件的存档文件。

我的问题是关于分发包和其中的模块之间的关系。

可能的解决方案空间

看起来可能富有成效的领域(但我尚未取得成功)是:

  • pydoc.help函数(作为help内置函数出现)在调用时输出所有可用模块的完整列表help('modules')。这显示了尚未导入但可以导入的模块。它以人类可读的形式输出到标准输出,我一直无法弄清楚代码pydoc是如何
    • 我可以想象调用它,收集模块列表,以编程方式使用 pip 将新的分发包安装到 virtualenv 中,再次调用它并比较结果。
  • 使用 pip 以编程方式安装分发包,以便
    • 遍历 python 路径的元素来查找模块

python module setuptools pypi python-packaging

3
推荐指数
1
解决办法
495
查看次数

如何从python脚本中获取资源文件的完整路径?

好的,所以我在包内创建了一个 python 脚本。这棵树看起来像这样:

\n\n
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 foo\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 funcs\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 stuff.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 resources\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 haarcascade_frontalface_default.xml\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 scripts\n\xe2\x94\x82\xc2\xa0\xc2\xa0  \xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0  \xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 script.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 setup.py\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,在脚本文件中,我使用 openCV 的 cv2 来检测人脸,为此需要cv2.CascadeClassifier位于 /resources 下的 XML 文件的路径。现在因为这是一个脚本,我需要能够从任何地方运行它,所以遗憾的是资源文件的相对路径并不能解决问题。如何从 script.py 中获取 xml 文件的绝对路径?您可以假设脚本和 xml 文件分别相对于彼此定位,就像上面的示例一样。谢谢 :))

\n\n

PS:如果该解决方案也适用于鸡蛋,那就更好了。非常感激

\n

python path package python-packaging

3
推荐指数
1
解决办法
5878
查看次数

virtualenv 的正确 shebang

我有项目 shell_script 和 virtualenv 的结构树是 shell_script/ENV/bin/python3 这个目录树应该看起来像 shebang 吗?

这不起作用

#!/ENV/bin/env python3.6
Run Code Online (Sandbox Code Playgroud)

python shebang virtualenv python-3.x python-packaging

3
推荐指数
1
解决办法
2764
查看次数

如何使用模块作为包的一部分和直接可执行的脚本?

假设我有一个名为 的包文件夹my_package。该目录包含一个名为 的文件__init__.py和一个my_module.py在其他模块文件中被称为的模块文件。该模块my_module.py包含功能do_something_with_file(file_path)

该函数在包的其他部分中使用,但如果可以将其作为命令行脚本调用,将文件路径作为第一个位置参数并执行该函数,那么它将很实用。我的第一个天真的方法是通过以下方式实现:

if __name__ == "__main__":
    import sys
    do_something_with_file(sys.argv[1])
Run Code Online (Sandbox Code Playgroud)

在文件中my_module.py

但这需要作为my_module.pymain 执行。但作为包的一部分,它使用相对导入,仅当模块作为包的一部分执行时才有效,但如果直接执行脚本则失败,这使得这种方法没有吸引力。看来该文件中的主块不是获得所需功能的正确方法。

将功能公开为简单脚本的良好做法是什么?

我没有使用 python 打包的经验,我通常通过执行直接使用脚本python my_script.py,但我想更好地了解包并通过包公开功能。

python python-import python-3.x python-packaging

3
推荐指数
1
解决办法
1440
查看次数

Python从另一个文件导出的包的子模块导入

我已经imports.py包含:

import os as exported_os
Run Code Online (Sandbox Code Playgroud)

foo.py包含:

from imports import exported_os
print(exported_os.path.devnull)    # works

from imports.exported_os.path import devnull    # doesn't
Run Code Online (Sandbox Code Playgroud)

有没有办法让第二次导入工作?我尝试添加__path__imports.py与它摆弄,但不能得到任何东西。

实际用例:ossome_library_version_nexported_ossome_library_version(我试图避免some_library_version_n在不同文件中拥有多个实例)。

python python-import python-3.x python-packaging

3
推荐指数
1
解决办法
282
查看次数

在 setup.cfg 中查找出现问题 | 路径中看不到模块

我一直在尝试正确打包我的 python 代码,将其上传到 git 上,然后安装在虚拟环境中,所有这些我都做了并且似乎工作得很好。问题是,一旦我在虚拟环境上安装我的代码,当我运行我的包时:

python3 -m mypackage
Run Code Online (Sandbox Code Playgroud)

它会引发一个错误,表明我导入的模块__main__.py(我的包有一个目录包含所有内容:__init__.py__main__.pymodule1.py等)中没有一个被看到。但是,一旦我“cd”到虚拟环境中安装包的位置,它就可以看到所有模块并且一切正常。我猜我的文件有问题setup.cfg,我猜“查找”命令没有执行它们应该执行的操作

还请让我知道是否还有其他东西可以写得更优雅。

[metadata]
# replace with your username:
name = my_package
version = 0.0.1
author = my_name
author_email = name@email.com
description = 
long_description = file: README.md
long_description_content_type = text/markdown
url = https://github.com/myname/mypackage
project_urls =
    Bug Tracker = https://github.com/myname/mypackage/issues
classifiers =
    Programming Language :: Python :: 3
    License :: OSI Approved :: MIT License
    Operating System :: OS Independent

[options]
package_dir =
    = …
Run Code Online (Sandbox Code Playgroud)

python setuptools virtualenv python-packaging

3
推荐指数
1
解决办法
1437
查看次数

安装工具包发现

我的项目有以下包树

\n
\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 src\n|    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 mypkg1\n|    \xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 module1.py\n|    \xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 module2.py\n|    \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 __init__.py\n|    |   |-- setup.py\n|    |   |__ requirements.py \n|    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 mypkg2\n|        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 module1.py\n|        \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 __init__.p\n|\n|---- base\n|      |----- init.py\n|      |----- module1.py      \n
Run Code Online (Sandbox Code Playgroud)\n

注意 - src 和 base 处于同一级别。

\n

我应该如何配置setup.py文件,以便我只能安装basemypkg1打包并排除mypkg2.

\n

我曾尝试['base','mypkg1']在软件包中提及,但没有成功,也尝试过使用find_packages()它只会显示mypkg1并且mypkg2

\n

python pip setuptools setup.py python-packaging

3
推荐指数
1
解决办法
3785
查看次数

说服诗歌从构建中排除文件

我正在用诗歌来构建我的包。我配置 pyproject.toml 以包含所有文件,tests但想要排除tests\\not_this_dir. 目标是当我在下面添加其他内容时,tests它们会被自动拾取。因为我有一些使用专有数据集的测试,所以我将它们放入其中,tests\\not_this_dir这样它们就不会被分发。

\n

我遇到的问题是我无法说服诗歌排除not_this_dir. 这是我的缩写的内容pyproject.toml

\n
[tool.poetry]\nname = "mypkg"\nversion = "0.2.0"\ninclude = [\n    { path = "data" },\n    { path = "tests" },\n\nexclude = [\n    { path = "tests/not_this_dir" }\n]\n\n[build-system]\nrequires = ["poetry-core"]\nbuild-backend = "poetry.core.masonry.api"\n
Run Code Online (Sandbox Code Playgroud)\n

文件结构为:

\n
mypkg\n\xc2\xa6   .gitignore\n\xc2\xa6   pyproject.toml\n\xc2\xa6   README.txt\n\xc2\xa6       \n+---mypkg\n\xc2\xa6   \xc2\xa6   a.py\n\xc2\xa6   \xc2\xa6   b.py\n\xc2\xa6   \xc2\xa6   __init__.py\n\xc2\xa6           \n+---data\n\xc2\xa6       e.json\n\xc2\xa6       f.json\n\xc2\xa6       \n+---tests\n\xc2\xa6   \xc2\xa6   conftest.py\n\xc2\xa6   \xc2\xa6   test_g.py\n\xc2\xa6   \xc2\xa6   test_h.py\n\xc2\xa6   \xc2\xa6   __init__.py\n\xc2\xa6   \xc2\xa6               \n\xc2\xa6   +---data\n\xc2\xa6   \xc2\xa6   +---g\n\xc2\xa6   \xc2\xa6 …
Run Code Online (Sandbox Code Playgroud)

python-packaging python-poetry

3
推荐指数
1
解决办法
3695
查看次数

Python 包及其对应的 PyPi 项目可以有不同的名称吗?

例如,我想知道如何可能是scikit-learnPyPi 包的名称,而实际的 Python 模块名为sklearn. 我问的原因是我有一个本地 Python 包packageA,无法上传到 PyPi,因为该名称恰好已被占用。因此我想知道我是否可以将其上传为packageB(实际上可以在 PyPi 上使用)?如果是这样,我该怎么做?

python pip pypi python-packaging

3
推荐指数
1
解决办法
624
查看次数