2015-02-08 24 views
3

我正在寫一個python模塊neuralnet。它在Python2中工作得很好,但在Python3中,導入失敗。Python3正確的方式來導入相對或絕對?

這是我的代碼結構。

neuralnet/ 
    __init__.py 
    train.py   # A wrapper to train (does not define new things) 
    neuralnet.py  # Defines the workhorse class neuralnet 
    layers/ 
     __init__.py 
     inlayer.py  # Defines input layer class 
     hiddenlayer.py 

application/   # A seperate application (not part of the package) 
    classify.py  # Imports the neuralnet class from neuralnet.py 

train.py需要導入neuralnet.py的neuralnet類。

neuralnet.py需要導入層/ inlayer.py等

這需要導入此模塊(我喜歡相對導入。)

我有一個不同的應用程序(classify.py)。 我在哪裏...

from neuralnet.neuralnet import neuralnet 

我試過幾種方法導入。 要麼我得到一個錯誤(大多晦澀像父不導入)

1)當運行train.py(這是neuralnet模塊的一部分)

from . import layer # In file neuralnet.py 
SystemError: Parent module '' not loaded, cannot perform relative import 

或者

2)同時運行classify.py(它在模塊之外)。

from layer.inlayers import input_layer # In file neuralnet.py 
ImportError: No module named 'layer' 

我的導入多年來在Python2中工作得非常好。我想知道Python3對我的期望是什麼?我應該將train.py移到我的模塊外面(技術上它不是模塊的一部分)?請建議最佳做法。

感謝 拉克什

+1

按'net.py'你的意思是'neuralnet.py'?您的示例不包含名爲'net.py'的文件。另外,如果train.py不是你的軟件包的一部分,那麼是的,你應該將它移出。 – BrenBarn 2015-02-08 23:46:58

回答

1

在Python 3,相對進口被禁止,見https://www.python.org/dev/peps/pep-0328/https://docs.python.org/release/3.0.1/whatsnew/3.0.html#removed-syntax

The only acceptable syntax for relative imports is from .[module] import name. All import forms not starting with . are interpreted as absolute imports. (PEP 0328)

from .stuff import Stuff明確相對導入,你 「應該」 做只要有可能,儘可能使用,並且必須在Python 3中使用。請前往https://stackoverflow.com/a/12173406/145400以獲取有關相關進口的更深入分析。

+0

不,那不行! 'from .layer.inlayers import'InputLayer' throws 'SystemError:父模塊''未加載,無法執行相對導入' – 2015-02-10 03:17:46

+1

您真的應該先清理您的問題(它仍然指向net.py)。然後,確保你正在正確使用'__init __。py'。在那裏,你指定一個包的公共接口。也就是說,在'neuralnet/__ init __。py'中,最好導入相關的所有內容,並通過'__all__'控制應該暴露給外部的內容。與你的圖層包一樣。神經網絡軟件包應該只從層中導入那些你明確公開在'layers/__ init __。py'中的實體。 – 2015-02-10 18:17:01