我运行的是Python 2.5。

这是我的文件夹树:

ptdraft/
  nib.py
  simulations/
    life/
      life.py

(我在每个文件夹中都有__init__.py,为了可读性,这里省略了)

我如何从生命模块内导入nib模块?我希望不需要修改sys.path就可以做到。

注意:正在运行的主模块在ptdraft文件夹中。


当前回答

上面提到的解决方案也很好。这个问题的另一个解决方案是

如果你想从顶级目录导入任何东西。然后,

from ...module_name import *

此外,如果您想从父目录导入任何模块。然后,

from ..module_name import *

此外,如果您想从父目录导入任何模块。然后,

from ...module_name.another_module import *

通过这种方式,如果您愿意,您可以导入任何特定的方法。

其他回答

在删除了一些系统路径黑客后,我认为添加它可能是有价值的

我喜欢的解决方案。

注意:这是一个框架挑战-没有必要在代码中做。

假设有一棵树,

project
└── pkg
    └── test.py

test.py包含什么

import sys, json; print(json.dumps(sys.path, indent=2)) 

使用路径执行只包括包目录

python pkg/test.py
[
  "/project/pkg",
 ...
]

但是使用module参数会包含项目目录

python -m pkg.test
[
  "/project",
  ...
]

现在,从项目目录导入的所有内容都可以是绝对的。不需要再耍花招了。

这是对我来说最简单的解决方法:

from ptdraft import nib

与过去的答案风格相同,但行数更少:P

import os,sys
parentdir = os.path.dirname(__file__)
sys.path.insert(0,parentdir)

文件返回您正在工作的位置

上面提到的解决方案也很好。这个问题的另一个解决方案是

如果你想从顶级目录导入任何东西。然后,

from ...module_name import *

此外,如果您想从父目录导入任何模块。然后,

from ..module_name import *

此外,如果您想从父目录导入任何模块。然后,

from ...module_name.another_module import *

通过这种方式,如果您愿意,您可以导入任何特定的方法。

相对进口(如从..Import mymodule)只在包中工作。 导入当前模块父目录中的'mymodule':

import os
import sys
import inspect

currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
parentdir = os.path.dirname(currentdir)
sys.path.insert(0, parentdir) 

import mymodule

编辑:__file__属性并不总是给定的。我现在建议使用inspect模块来检索当前文件的文件名(和路径),而不是使用os.path.abspath(__file__)