gpt4 book ai didi

python - 如何在导入中使用根包?

转载 作者:行者123 更新时间:2023-12-01 03:43:59 26 4
gpt4 key购买 nike

采取Ansible以项目为例,里面有lib/ansible root directory ,许多其他包,像这样

ansible/cli
/errors
/...many omitted for brevity
/utils
/vars
__init__.py

举个例子,在 ansible/utils/vars.py 中,导入从根 ansible/lib 目录开始,例如

   from ansible.errors import AnsibleError

from ansible.errors import AnsibleError

而不是

from errors import AnsibleError etc.

我有一个具有这样目录结构的演示项目

beatles/george/harrison.py
/george/__init__.py
/john/lennon.py
/john/__init__.py
/ringo/starr.py
/ringo/__init__.py
/paul/mccartney.py
/paul/__init__.py
__init__.py (this __init__.py file is in the beatles dir)
helpers.py

因此,使用 Ansible 示例,我尝试(在文件 john/lennon.py 中)执行

从beatles.george.harrison导入吉他

但我收到错误“没有名为beatles.george.harrison的模块

但是,如果我省略 beatles 包(相当于 ansible 项目中的 ansible),代码可以正常工作

从 george.harrison 导入吉他

为什么我的目录结构无法将导入编码为

from beatles.george.harrison import Guitar

来自beatles/john/lennon.py 文件?如果可能,请引用 ansible 项目进行解释,以便清楚为什么它在一种情况下有效,但在另一种情况下无效。

>>> from beatles.john.lennon import Guitar Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: No module named beatles.john.lennon 
>>> from john.lennon import Guitar >>> Guitar <class 'john.lennon.Guitar'>

最佳答案

此处的区别在于,当您安装 ansible 时,它​​将文件放入可从 sys.path 访问的子目录中。例如,它可能会放在这里:

/home/leahcim/.local/lib/python2.7/site-packages'

这只是对位置的猜测。 导入 ansible 并检查 ansible.__file__ 的实际位置(确切位置取决于几个因素)。

现在,如果您编写一个 setup.py 文件,您还可以通过以下方式让您的应用程序在本地可见:

python setup.py develop

如果您还不想为您的应用编写有效的 setup.py,那么您需要找到其他方法使其在 sys.path< 中可见

具体来说,“beatles”目录的父目录应包含在 sys.path 中。一种简单的方法是将其导出到环境变量 PYTHONPATH 中。

关于python - 如何在导入中使用根包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39216182/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com