免责声明:在搜索了大量非常相似的提要之后,这些提要最终都解决了一个稍微不同的问题,我想我必须打开一个新的问题(尽管我确信在某个地方存在一个答案-->;所以如果您知道的话,请指出它)
问题:我正在使用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
我现在要装货测试食物棒在project/notebooks/skript.py
之内。所以,我在那本书里
import sys
sys.path.append('../')
如果我再跑
import test.foo.bar # or: import test.foo
Python告诉我
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
或者 从测试食物棒导入文件 只是屈服
ImportError: No module named foo.bar
同样适用于
sys.path.append('../test/foo/bar')
import test.foo.bar.file
我还是不知道出了什么问题?你知道吗
你在用IDE吗?如果是这样,请将项目属性中Python解释器的路径添加到所有主包(foo、test、notebooks)。否则,尝试显式地将bar包添加到sys路径,如下所示
它应该与
但是您必须将
__init__.py
添加到项目目录中。你知道吗对于Python3,它将是:
如果在文件夹名称前面使用点,python将在您正在处理的文件所在的目录中搜索该文件。你知道吗
对不起,我英语不好。你知道吗
玩弄
sys.path
很少是个好主意。你知道吗因为您的计划似乎是同时使用
foo
和test
来自notebooks
(可能只包含Jupyter笔记本),所以最干净的解决方案是将foo
和test
作为包安装。你知道吗从顶级目录和
notebooks
中删除__init__.py
,因为您不想导入它们。然后将setup.py
添加到顶级目录。因为您的测试是特定于foo
的,所以您应该将它们重命名为foo_test
,或者将它们移动到foo
本身。你知道吗一个最小的
setup.py
看起来像这样然后您只需在顶层目录中
pip install -e .
,它就会安装到当前的virtualenv中。如果您没有使用virtualenvs,您应该pip install user -e .
相关问题 更多 >
编程相关推荐