想象一下这个目录结构:

app/
   __init__.py
   sub1/
      __init__.py
      mod1.py
   sub2/
      __init__.py
      mod2.py

我正在编写mod1,我需要从mod2中导入一些东西。我该怎么做呢?

我试过…sub2导入mod2,但我得到了一个“尝试相对导入非包”。

我搜索了一下,但只找到了“sys”。路径操纵“黑客”。没有干净的方法吗?


编辑:我所有的__init__.py目前是空的

Edit2:我试图这样做是因为sub2包含跨子包共享的类(sub1、subX等)。

Edit3:我正在寻找的行为与PEP 366中描述的相同(感谢John B)


当前回答

看看http://docs.python.org/whatsnew/2.5.html#pep-328-absolute-and-relative-imports。你可以这样做

from .mod1 import stuff

其他回答

这是100%解决的问题:

app / main.py 设置/ local_setings.py

在app/main.py中导入settings/local_setting.py:

main.py:

import sys
sys.path.insert(0, "../settings")


try:
    from local_settings import *
except ImportError:
    print('No Import')

“Guido将包中运行的脚本视为反模式”(拒绝 pep - 3122)

我花了很多时间试图找到一个解决方案,阅读Stack Overflow上的相关文章,并对自己说“一定有更好的方法!”看起来没有。

def import_path(fullpath):
    """ 
    Import a file with full path specification. Allows one to
    import from anywhere, something __import__ does not do. 
    """
    path, filename = os.path.split(fullpath)
    filename, ext = os.path.splitext(filename)
    sys.path.append(path)
    module = __import__(filename)
    reload(module) # Might be out of date
    del sys.path[-1]
    return module

我使用这个代码片段从路径导入模块,希望有帮助

我发现将“PYTHONPATH”环境变量设置到顶部文件夹更容易:

bash$ export PYTHONPATH=/PATH/TO/APP

然后:

import sub1.func1
#...more import

当然,PYTHONPATH是“全局的”,但它还没有给我带来麻烦。

我把这个写在这里供我自己参考。我知道这不是好的Python代码,但我需要一个我正在进行的项目的脚本,我想把脚本放在脚本目录中。

import os.path
import sys
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))