2011-01-11 48 views
22
stuff/ 
    __init__.py 
    mylib.py 
    Foo/ 
     __init__.py 
     main.py 
     foo/ 
      __init__.py 
      script.py 

script.py要进口mylib.py如何做到相对进口在Python

这只是一个例子,但是我真的只想做一个模块的相对进口的父目录。我已经尝试了各种东西,得到这个错误...

Attempted relative import beyond toplevel package

我读的地方,从程序开始的地方不应该在包装,我试图改变结构,像这样的脚本...

stuff/ 
    mylib.py 
    foo.py // equivalent of main.py in above 
    foo/ 
     __init__.py 
     script.py 

但得到同样的错误。

我该如何做到这一点?这甚至是一个适当的方法?

编辑:在Python 2

回答

28

与它摆弄多一点之后,我意识到如何设置它,以及特异性我不会用foo的缘故酒吧名称。我的项目目录设置为...

tools/ 
    core/ 
     object_editor/ 
      # files that need to use ntlib.py 
      editor.py # see example at bottom 
      __init__.py 
     state_editor/ 
      # files that need to use ntlib.py 
      __init__.py 
     ntlib.py 
     __init__.py # core is the top level package 
    LICENSE 
    state_editor.py # equivalent to main.py for the state editor 
    object_editor.py # equivalent to main.py for the object editor 

object_editor.py的线看起来像......

from core.object_editor import editor 

editor.py的线看起来像......

from .. import ntlib 

或或者

from core import ntlib 

关键是,在我给出的问题中,“主”脚本是从包内运行的。一旦我将它移出来,创建了一个特定的包(core),并且将我希望编辑共享的库(ntlib)移动到该包中,所有内容都是令人惊叹的。

1

import ..foo..stuff.mylib应该没问题

编辑起飞扩展

+4

我不认为这是有效的语法。 – random 2011-01-11 08:43:29

+0

`from ..foo..stuff.mylib import any whatever` should ok – tekknolagi 2011-01-11 08:46:30

+0

import sys sys.path.append() import Bar
tekknolagi 2011-01-11 08:49:36

10

但只要“东西”是不是在你的Python路径中,你有没有选择,而不是添加路径。

如果你知道你的script.py从东西的水平,你可以做例子:

import sys 
import os 
sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..')) 
1

从看来,你不能使用相对进口导入未打包文件的PEP

所以,你会需要一个__init__.py添加的东西,改变你的进口,以类似from .mylib import *

然而,PEP似乎并没有考虑到保持MYLIB模块中打包。所以你可能需要改变你如何调用你的库函数。

另一种方法是将MyLib进入一个子包,并导入它作为from .libpackage import mylib

7

我在Windows 7上运行Python 3.4.2,并在此之上撕掉了我的头发。

如果运行的是这些:

蟒蛇-m单元测试 蟒蛇-m单元测试发现

...我会得到 '超越顶层包未遂相对进口' 的错误。

对我来说,解决方案是在我的[test_stock.py]中删除“..”。 线为: 进口..stock股票

将其改为:现货进口库存

..和它的作品。

文件夹结构:

C:\ 
    | 
    +-- stock_alerter 
      | 
      +-- __init__.py 
      +-- stock.py 
      | 
      \-- tests 
        | 
        +-- __init__.py 
        \-- test_stock.py