首页 > 解决方案 > 从同级目录导入 Python

问题描述

免责声明:在搜索了大量非常相似的提要后,这些提要最终都解决了一个稍微不同的问题,我想我必须提出一个新问题(尽管我确信某处存在答案 --> 所以指出如果你知道的 ;)

问题:我正在使用 Python 2,正在用这棵树构建一个项目:

project
├── __init__.py
├── foo  
│   └── __init__.py
│   └── bar   
│       └── __init__.py
├── notebooks   
│   └── __init__.py
│   └── skript.py
└── test
    └── __init__.py
    └── foo   
        └── __init__.py
        └── bar   
            └── __init__.py
            └── file.py

现在我想从内部加载 test.foo.bar project/notebooks/skript.py。因此,我在那个脚本中

import sys
sys.path.append('../')

如果我再跑

import test.foo.bar  # or: import test.foo

蟒蛇告诉我

ImportError: No module named foo.bar

(或ImportError: No module named foo分别)。有趣的是,import test不会抛出错误,但如果我这样做test.foo,它会抛出一个AttributeError: 'module' object has no attribute 'foo'.

所以我想知道,这里出了什么问题以及如何解决它?


编辑

另外,我尝试将其添加到skript.py

import sys
import os
MYDIR = os.path.dirname(os.path.abspath(__file__))
sys.path.append(os.path.join(MYDIR,'../test'))
sys.path.append(os.path.join(MYDIR,'../test/foo'))
sys.path.append(os.path.join(MYDIR,'../test/foo/bar')) #I am not sure this is entirely needed

如下所述。仍然,

import test.foo.bar.file

或从 test.foo.bar 导入文件中只产生

ImportError: No module named foo.bar

相同的

sys.path.append('../test/foo/bar')
import test.foo.bar.file

我仍然不知道出了什么问题?

标签: pythonpython-import

解决方案


sys.path来很少是一个好主意。

由于您的计划似乎是同时使用footestfrom notebooks(可能只包含 Jupyter 笔记本),最干净的解决方案是安装footest作为包。

__init__.py从您的顶级目录中删除 和,notebooks因为您不想导入它们。然后将一个添加setup.py到您的顶级目录。由于您的测试特定于foo,因此您应该重命名它们foo_test或将它们移动到foo自身中。

最小setup.py看起来像这样

from setuptools import setup

setup(name='foo',
      version='0.1',
      description='descroption of fo',
      author='you',
      author_email='your@mail',
      packages=['foo','test_foo])

然后你可以简单地pip install -e .在你的顶级目录中,它将被安装到你当前的 virtualenv 中。如果你没有使用 virtualenvs,你应该pip install --user -e .


推荐阅读