以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
包(相当于ansible项目中的ansible),代码就可以正常工作
从乔治·哈里森导入吉他
为什么用我的目录结构,我不能将导入编码为
from beatles.george.harrison import Guitar
来自披头士/约翰/列侬.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'>
对我有用。结构:
以及:
以及:
我可以这样做,我的工作目录是
beatles
文件夹:这似乎正是您所描述的设置,但在
lennon.py
从harrison.py
导入Guitar
时不会给出错误消息。你知道吗以及
因此,我的工作目录是路径中的第一项。你试过安装你的软件包吗?还是在你的工作目录里?你知道吗
这里的区别是,当您安装ansible时,它会将文件放入一个子目录中,该子目录可以从
sys.path
访问。例如,它可能在这里:那只是对地点的猜测。
import ansible
并在ansible.__file__
上检查它最终到达的实际位置(确切位置取决于几个因素)。你知道吗现在,如果您编写一个
setup.py
文件,您还可以通过以下方法使您的应用程序在本地可见:如果您还不想为您的应用程序编写一个工作的
setup.py
,那么您需要找到其他方法使它在sys.path
中可见。你知道吗具体来说,您的“披头士”目录的父目录应该包含在
sys.path
中。一种简单的方法是将其导出到环境变量PYTHONPATH
。你知道吗相关问题 更多 >
编程相关推荐