2014-01-06 43 views
0

我的代碼中有一些python模塊/包的用法上的困難。該代碼是在這裏:https://github.com/cjlano/svg在包中使用python模塊

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

在模塊svg我需要使用該模塊geometry。由於所有代碼在​​的開頭都不存在,因此我決定將整個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中可用的任何想法?

謝謝!

回答

1

Python 3 doesn't do implicit relative imports any more

這意味着你需要或者使geometry進口在​​的明確相對進口,或better yet,將其更改爲絕對導入:

from svg.geometry import * 

正如@CJlano指出,這則還需要from __future__ import absolute_import它仍然可以在Python 2上工作。

+1

對於Python2,需要'from __future__ import absolute_import' – CJlano

+1

好的,謝謝,我相應地更新了我的答案。 –

1

它可在Python 2.7版和3.x工作,如果你使用​​相對導入: 「」

from .geometry import * 

注意在模塊名稱前面。

+0

感謝這個作品的發現,但它打破了我的測試腳本'svg.test.py':'from .geometry import * ValueError:嘗試在非包中進行相對導入如何馬什麼都可以一起工作? – CJlano

+1

你是如何執行該文件的?我認爲你有一個帶有「。」的文件會引起麻煩。在模塊名稱的中間(我期望混淆python導入邏輯)。嘗試將該文件重命名爲* svg_test.py *,然後查看是否解決了問題。 – bogatron

+0

重命名不起作用。我從bash命令行調用'$ python svg_test.py'來運行我的腳本。 Python2說'從.geometry導入* ValueError:試圖在非包和Python3中從.geometry導入相對導入* SystemError:父類模塊''未加載,無法執行相對導入','import svg'和'from 'svg_test.py'中導入svg import svg'方法。 – CJlano