如何在导入中使用根包?

2024-09-29 23:31:56 发布

您现在位置:Python中文网/ 问答频道 /正文

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'>

Tags: 项目frompyimport目录initansiblejohn
2条回答

对我有用。结构:

.
└── beatles
    ├── george
    │   ├── harrison.py
    │   ├── __init__.py
    ├── __init__.py
    ├── john
    │   ├── __init__.py
    │   ├── lennon.py
    ├── paul
    │   ├── __init__.py
    │   └── mccartney.py
    └── ringo
        ├── __init__.py
        └── starr.py

以及:

$ cat beatles/john/lennon.py

from beatles.george.harrison import Guitar

def Guitar(x):
    return "John's guitar"

以及:

$ cat beatles/george/harrison.py

def Guitar(x):
    return "George's guitar"

我可以这样做,我的工作目录是beatles文件夹

>>> from beatles.john.lennon import Guitar
>>> Guitar(1)
"John's guitar"

这似乎正是您所描述的设置,但在lennon.pyharrison.py导入Guitar时不会给出错误消息。你知道吗

Python 2.7.6 (default, Jun 22 2015, 17:58:13) 

以及

>>> sys.path
['', '/usr/lib/py...[etc]

因此,我的工作目录是路径中的第一项。你试过安装你的软件包吗?还是在你的工作目录里?你知道吗

这里的区别是,当您安装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中可见。你知道吗

具体来说,您的“披头士”目录的父目录应该包含在sys.path中。一种简单的方法是将其导出到环境变量PYTHONPATH。你知道吗

相关问题 更多 >

    热门问题