如何在导入中使用根包?

利亚希姆

Ansible项目为例,在lib / ansible根目录中有许多其他软件包,例如

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示例,我尝试(在file中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'

那只是对位置的猜测。import ansible并检查ansible.__file__其最终到达的实际位置(确切位置取决于几件事)。

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

python setup.py develop

如果您现在还不想编写setup.py适合您的应用的作品,那么您将需要找到其他方法使其在中可见sys.path

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章