我在导入包时遇到问题。我的文件结构是这样的:
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 ...
感谢任何有关解决此问题的提示。我不明白为什么这个导入不起作用。
给定一个 PyPI 包名称,例如PyYAML,如何以编程方式确定包(分发包)中可以导入的可用模块?
我对此并不是特别感兴趣PyYAML,它只是一个流行的 PyPI 包的一个很好的例子,它的包名称 ( PyYAML) 与其主模块名称 ( yaml) 不同,这样你就不能轻易地从包名称中猜出模块名称。
我见过其他听起来像这样但不同的问题的答案,可能是因为命名冲突
我的问题是关于分发包和其中的模块之间的关系。
看起来可能富有成效的领域(但我尚未取得成功)是:
pydoc.help函数(作为help内置函数出现)在调用时输出所有可用模块的完整列表help('modules')。这显示了尚未导入但可以导入的模块。它以人类可读的形式输出到标准输出,我一直无法弄清楚代码pydoc是如何
。
好的,所以我在包内创建了一个 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\nRun Code Online (Sandbox Code Playgroud)\n\n因此,在脚本文件中,我使用 openCV 的 cv2 来检测人脸,为此需要cv2.CascadeClassifier位于 /resources 下的 XML 文件的路径。现在因为这是一个脚本,我需要能够从任何地方运行它,所以遗憾的是资源文件的相对路径并不能解决问题。如何从 script.py 中获取 xml 文件的绝对路径?您可以假设脚本和 xml 文件分别相对于彼此定位,就像上面的示例一样。谢谢 :))
PS:如果该解决方案也适用于鸡蛋,那就更好了。非常感激
\n我有项目 shell_script 和 virtualenv 的结构树是 shell_script/ENV/bin/python3 这个目录树应该看起来像 shebang 吗?
这不起作用
#!/ENV/bin/env python3.6
Run Code Online (Sandbox Code Playgroud) 假设我有一个名为 的包文件夹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,但我想更好地了解包并通过包公开功能。
我已经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与它摆弄,但不能得到任何东西。
实际用例:os是some_library_version_n和exported_os是some_library_version(我试图避免some_library_version_n在不同文件中拥有多个实例)。
我一直在尝试正确打包我的 python 代码,将其上传到 git 上,然后安装在虚拟环境中,所有这些我都做了并且似乎工作得很好。问题是,一旦我在虚拟环境上安装我的代码,当我运行我的包时:
python3 -m mypackage
Run Code Online (Sandbox Code Playgroud)
它会引发一个错误,表明我导入的模块__main__.py(我的包有一个目录包含所有内容:__init__.py、__main__.py、module1.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) 我的项目有以下包树
\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 \nRun Code Online (Sandbox Code Playgroud)\n注意 - src 和 base 处于同一级别。
\n我应该如何配置setup.py文件,以便我只能安装base和mypkg1打包并排除mypkg2.
我曾尝试['base','mypkg1']在软件包中提及,但没有成功,也尝试过使用find_packages()它只会显示mypkg1并且mypkg2。
我正在用诗歌来构建我的包。我配置 pyproject.toml 以包含所有文件,tests但想要排除tests\\not_this_dir. 目标是当我在下面添加其他内容时,tests它们会被自动拾取。因为我有一些使用专有数据集的测试,所以我将它们放入其中,tests\\not_this_dir这样它们就不会被分发。
我遇到的问题是我无法说服诗歌排除not_this_dir. 这是我的缩写的内容pyproject.toml。
[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"\nRun Code Online (Sandbox Code Playgroud)\n文件结构为:
\nmypkg\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) 例如,我想知道如何可能是scikit-learnPyPi 包的名称,而实际的 Python 模块名为sklearn. 我问的原因是我有一个本地 Python 包packageA,无法上传到 PyPi,因为该名称恰好已被占用。因此我想知道我是否可以将其上传为packageB(实际上可以在 PyPi 上使用)?如果是这样,我该怎么做?
python-packaging ×10
python ×9
python-3.x ×3
setuptools ×3
pip ×2
pypi ×2
virtualenv ×2
module ×1
package ×1
path ×1
setup.py ×1
shebang ×1