从同级目录导入Python

2024-04-28 05:34:03 发布

您现在位置: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

我现在要装货测试食物棒在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

我还是不知道出了什么问题?你知道吗


Tags: pathpytestimportfooinitossys
3条回答

你在用IDE吗?如果是这样,请将项目属性中Python解释器的路径添加到所有主包(foo、test、notebooks)。否则,尝试显式地将bar包添加到sys路径,如下所示

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

它应该与

from test import foo

但是您必须将__init__.py添加到项目目录中。你知道吗

对于Python3,它将是:

from .test import foo

如果在文件夹名称前面使用点,python将在您正在处理的文件所在的目录中搜索该文件。你知道吗

对不起,我英语不好。你知道吗

玩弄sys.path很少是个好主意。你知道吗

因为您的计划似乎是同时使用footest来自notebooks(可能只包含Jupyter笔记本),所以最干净的解决方案是将footest作为包安装。你知道吗

从顶级目录和notebooks中删除__init__.py,因为您不想导入它们。然后将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 .

相关问题 更多 >