python - 从同级目录导入 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
我仍然不知道出了什么问题?
解决方案
乱sys.path
来很少是一个好主意。
由于您的计划似乎是同时使用foo
和test
from notebooks
(可能只包含 Jupyter 笔记本),最干净的解决方案是安装foo
和test
作为包。
__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 .
推荐阅读
- ios - UINavigationView 弹出到根视图控制器问题
- php - 从 cmd 运行时,来自 WAMP 服务器的 PHP 没有看到 .htaccess 文件
- google-apps-script - 类表方法 getActiveCell、getCurrentCell、getActiveRange 无法按预期工作
- ejabberd - 如何使用 Smack Client 在 Ejabberd 中注册带内用户,特别是虚拟主机?
- javascript - 将两个代码合二为一 - 检查 url 是否存在/登录
- ios - 在谷歌地图中使用谷歌可拖动标记时用户界面没有响应
- mysql - 在多个一对多表上的 Mysql 上获取 group by 数据的问题
- laravel - Laravel 5.8 - 从采摘结果中获取值
- json - 在 SQL Server 中为我的选择查询读取 JSON 数据
- sql - (API) 如何在多个表中插入行