以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] 删除。
我来说两句