python - python:如何导入包?

这是我的文件夹:

/Workspace
 somefiles.py
          /foopackage
           __init__.py
           foo1.py
           foo2.py

而初始py包含
from foo1 import foo1
from foo2 import foo2

我想导入foopack。
我试过这个:
>>>import sys
>>>sys.path.append('/home/username/Workspace')
>>>import foopackage
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/username/Workspace/foopackage/__init__.py", line 1, in <module>
    from foo1 import foo1
ImportError: No module named 'foo1'

我已经尝试了sys.path.append('/home/username/Workspace/foopackage'),但问题已经解决。
我在问我是否必须将每个包目录添加到sys.path列表才能导入它们?
或者别的什么不对劲?

最佳答案

如果使用的是Python 3,则需要使用显式相对导入,而不是隐式相对导入,后者在Python 2中使用。尝试将foopackage__init__.py文件更新为:

from .foo1 import foo1
from .foo2 import foo2

前导的.字符告诉Pythonfoo1foo2是同级模块,而不是绝对引用的顶级模块。另一种选择是使用对它们的绝对引用:
from foopackage.foo1 import foo1
from foopackage.foo2 import foo2

但就我个人而言,这有点过分。如果您在将来的某个时候更改包名称(或移动到其他包的子包),它也将中断。
有关相对导入更改的详细信息,请参见PEP 328

本文翻译自 https://stackoverflow.com/questions/19192009/

网站遵循 CC BY-SA 4.0 协议,转载或引用请注明出处。

标签 python sys.path


相关文章:

python - 分配到具有项大小> 1的Python 3.x缓冲区中

python - 将包含字符串列的pandas DataFrame传递给kdb +(使用qPython API)

python - Python:确保os.environ和sys.path相等:web-requests,shell,cron,celery

python - 我可以将pip用户安装的软件包优先于系统吗?

python - 如何在Google App Engine(Python)中修改sys.path?

python - 如何在Django网页中嵌入matplotlib图?

python - 将RGB图像转换为棕褐色滤镜的公式是什么? [重复]

python - Python setup.py:如何获取find_packages()来标识子目录中的软件包

python - python:lib / site-packages / site.py和lib / site.py之间的相互作用

java - 在Jython中设置导入模块路径-奇怪的行为