我的项目结构如下。在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'
答案 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
。