在包中使用python模块

时间:2014-01-06 21:42:45

标签: python python-2.7 python-3.x module package

我的代码中的python模块/包使用有些困难。代码在这里:https://github.com/cjlano/svg

.
└── svg
    ├── geometry.py
    ├── __init__.py
    ├── LICENSE
    ├── README.md
    ├── svg.py
    ├── svg.test.py
    └── tests
        └── [...]

在模块svg中,我需要使用模块geometry。由于当所有代码都在svg.py时,该模块不存在,我决定将整个geometry命名空间导入svg(from geometry import *)。

我的问题是,当我从我的包中导入svg模块时,它在python2中运行良好但在python3中失败:

Python 2.7.5 (default, Sep  6 2013, 09:59:46) 
[GCC 4.8.1 20130725 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from svg import svg
>>> help(svg)

授予我访问svg模块文档的权限。而

Python 3.3.2 (default, Sep  6 2013, 09:35:59) 
[GCC 4.8.1 20130725 (prerelease)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from svg import svg
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "./svg/svg.py", line 27, in <module>
    from geometry import *
ImportError: No module named 'geometry'

导入时出错。

关于如何编写我的代码以便在python3中使用的任何想法?

谢谢!

2 个答案:

答案 0 :(得分:1)

如果在svg.py中使用相对导入,它将在python 2.7和3.x中都有效:

from .geometry import *

注意“。”在模块名称前面。

答案 1 :(得分:1)

Python 3 doesn't do implicit relative imports any more

这意味着您需要在geometry中导入svg.py 显式相对导入,或better yet,将其更改为绝对导入:

from svg.geometry import *

正如@CJlano指出的那样,它还需要from __future__ import absolute_import才能在Python 2上运行。