如何从另一个目录导入python包?

csy*_*oul 13 python python-module python-3.x

我有一个结构如下的项目:

project
??? api
?   ??? __init__.py
?   ??? api.py
??? instance
?   ??? __init__.py
?   ??? config.py
??? package
?   ??? __init__.py
?   ??? app.py
??? requirements.txt
??? tests
    ??? __init__.py
Run Code Online (Sandbox Code Playgroud)

我正在尝试config.pypackage/app.py如下所示调用文件:

# package/app.py
from instance import config

# I've also tried
import instance.config
import ..instance.config
from ..instance import config
Run Code Online (Sandbox Code Playgroud)

但我总是收到以下错误:

Traceback (most recent call last):
  File "/home/csymvoul/projects/project/package/app.py", line 1, in <module>
    from instance import config
ModuleNotFoundError: No module named 'instance'
Run Code Online (Sandbox Code Playgroud)

修改sys.path不是我想做的事情。我知道这个问题得到了很好的回答,但给出的答案对我不起作用。

编辑:当移动app.py到根文件夹时,它工作得很好。但我需要把它放在package文件夹下。

RMP*_*MPR 14

您可以将父目录添加到PYTHONPATH,为了实现这一点,您可以使用sys.path. 因此,您可以轻松添加父目录,如下所示:

import sys
sys.path.insert(0, '..')

from instance import config
Run Code Online (Sandbox Code Playgroud)

请注意,前面的代码使用相对路径,因此您必须在同一位置启动文件,否则它可能无法工作。要从任何地方启动,您可以使用该pathlib模块。

from pathlib import Path
import sys
path = str(Path(Path(__file__).parent.absolute()).parent.absolute())
sys.path.insert(0, path)

from instance import config
Run Code Online (Sandbox Code Playgroud)

但是,以前的方法比任何事情都更重要,为了正确地做事,您首先需要根据这篇非常详细的博客文章python 打包重塑您的项目结构,使用src文件夹的推荐方式。

  • 您的目录布局必须如下所示:
project
??? CHANGELOG.rst
??? README.rst
??? requirements.txt
??? setup.py
??? src
?   ??? api
?   ?   ??? api.py
?   ?   ??? __init__.py
?   ??? instance
?   ?   ??? config.py
?   ?   ??? __init__.py
?   ??? package
?       ??? app.py
?       ??? __init__.py
??? tests
    ??? __init__.py
Run Code Online (Sandbox Code Playgroud)

请注意,您实际上并不需要 ,requirements.txt因为您可以在setup.py. 示例setup.py(改编自此处):

import sys
sys.path.insert(0, '..')

from instance import config
Run Code Online (Sandbox Code Playgroud)

我的内容api.py

from instance import config

def main():
    print("imported")
    config.config()
Run Code Online (Sandbox Code Playgroud)

我的内容config.py

def config():
    print("config imported successfully")
Run Code Online (Sandbox Code Playgroud)

你可以在这里找到所有以前的

  • 可选但推荐:创建一个虚拟环境,我使用venv(Python 3.3 <=) 在项目的根目录中:
python -m venv .
Run Code Online (Sandbox Code Playgroud)

并激活:

source bin/activate
Run Code Online (Sandbox Code Playgroud)
  • 现在我可以安装软件包:

在项目的根目录中使用pip install -e .(带点)命令

  • 您的导入from instance import config现在有效,以确认您可以使用以下命令运行 api.py:
python src/api/api.py
Run Code Online (Sandbox Code Playgroud)