从子文件夹python导入

时间:2020-09-21 12:00:02

标签: python python-3.x python-import

我的项目结构如下。在api.py内部,我需要一些在上层编写的函数。

Project1
├── model.py 
├── audio_utils.py
├── audio.py 
└── backend
     ├── static
     │      ├──js
     │      ├──img
     └── api.py

为什么我无法在api.py内部导入上层函数? 当我尝试做时:

from audio_utils import *

我得到了以下内容:

 No module named 'audio_utils'

3 个答案:

答案 0 :(得分:1)

模块是从sys.path中指定的路径前缀导入的。它通常包含'',这意味着将从当前工作目录中加载模块。 (https://docs.python.org/3/tutorial/modules.html#packages

我认为您在backend目录中时正在启动Python解释。然后,我认为没有办法访问上层目录中的模块-除非使用..https://realpython.com/absolute-vs-relative-python-imports/#syntax-and-practical-examples_1),否则除非您更改sys.path,否则这是一个非常麻烦的解决方案。

我建议您创建__init__.py文件以指示包含它们的目录是 Python包

Project1
├── model.py 
├── audio_utils.py
├── audio.py 
└── backend
     |-- __init__.py
     ├── static
     │      ├──js
     │      ├──img
     └── api.py

并且始终从Project1目录开始解释。这样做,您应该能够像这样导入任何模块:

import model
from backed import api
import audio_utils

无论您在Project1中的哪个模块中编写此代码,都将尝试使用当前解释的目录

请注意,还有一个PYTHONPATH env变量,您可以利用它来发挥自己的优势。

请注意,为发布您的项目,建议将所有模块放在一个程序包中(换句话说:不要将模块放在顶层)。这是为了防止名称冲突。我认为这可以帮助您了解:https://realpython.com/pypi-publish-python-package/

答案 1 :(得分:0)

两个目录中都有__init__.py个文件吗?

尝试from ..audio_utils import *

答案 2 :(得分:0)

如果您以这种方式创建目录结构:

$ tree
.
├── bar
│   ├── den.py
│   └── __init__.py  # This indicates the bar is python package.
└── baz.py

1 directory, 3 files
$ cat bar/den.py 
import baz

然后在包含bar/baz.py(顶层)的目录中,您可以启动Python解释并使用绝对导入:

In [1]: import bar.den                                                                                                                                                                        

In [2]: import baz                                                                                                                                                                            

In [3]: bar.den.baz                                                                                                                                                                           
Out[3]: <module 'baz' from '/tmp/Project1/baz.py'>

如您所见,我们能够导入bar.den,这也可以从顶层导入baz