如何从父子目录导入模块

use*_*765 5 python python-import

我想class从父目录中的一个目录中的 python 文件中导入一个。这是我当前的文件夹结构:

?   run_simulation_from_parent.py
?   __init__.py
?
????.vscode
?       launch.json
?       settings.json
?
????mod
?   ?   mods.py
?   ?   __init__.py
?   ?
?   ????__pycache__
?           __init__.cpython-37.pyc
?
????sim
?   ?   run_simulation.py
?   ?   __init__.py
?   ?
?   ????__pycache__
?           __init__.cpython-37.pyc
?
????__pycache__
        __init__.cpython-37.pyc
Run Code Online (Sandbox Code Playgroud)

该文件mod/mods.py包含以下类:

class Objective:
    """Objective function class"""

    def __init__(self, x):
        self.x = x
Run Code Online (Sandbox Code Playgroud)

该文件sim/run_simulation.py包含:

from mod.mods import Objective

x = 5
obj = Objective(x)
Run Code Online (Sandbox Code Playgroud)

当我尝试运行它时,出现以下错误:

  File "sim/run_simulation.py", line 1, in <module>
    from mod.mods import Objective
ModuleNotFoundError: No module named 'mod'
Run Code Online (Sandbox Code Playgroud)

在 Visual Studio 代码中,当我开始输入mod.modsimport Objective

当我run_simulation_from_parent.py使用以下内容运行时,我没有问题:

from mod.mods import Objective

x = 5
obj = Objective(x)

print(obj.x)
Run Code Online (Sandbox Code Playgroud)

我怎样才能从目录中做到这一点sim?我已经尝试了以下方法:

  1. 使用from ..mod.mods import Objective到run_simulation.py
  2. 使用具有以下内容的init .py 文件:import os, sys sys.path.append(os.path.dirname(os.path.realpath(__file__)))

  3. 没有__init__.py文件

编辑:我从我在父目录中开始的 Visual Studio 代码运行该文件。我还尝试从我使用的 sim 文件夹中的 windows 命令行

python run_simulation.py
Run Code Online (Sandbox Code Playgroud)

jfa*_*oni 5

我处理项目内部导入的方法是以可编辑模式安装项目。这样,所有文件都能够相互定位,始终从项目根目录开始。

为此,请按照下列步骤操作:

1)编写一个 setup.py文件并将其添加到您的项目根文件夹 - 它根本不需要太多信息:

# setup.py
from setuptools import setup, find_packages

setup(name='MyPackageName', version='1.0.0', packages=find_packages())
Run Code Online (Sandbox Code Playgroud)

2)以可编辑模式安装包(最好是从虚拟环境)。从项目文件夹中的终端写入

$ pip install -e .
Run Code Online (Sandbox Code Playgroud)

请注意点 - 这意味着“以可编辑模式从当前目录安装包”。

3)项目内的文件现在能够相互定位,始终从项目根目录开始。Objective例如,要导入,您可以编写:

from mod.mods import Objective
Run Code Online (Sandbox Code Playgroud)

对于任何文件的导入都是如此Objective,无论它位于项目结构中的哪个位置

就像我说的,你应该为此使用虚拟环境,这样 pip 就不会将你的包安装到你的主要 Python 安装中(如果你的项目有很多依赖项,这可能会很混乱)。

我最喜欢的工具是pipenv。使用时,将终端命令替换为

$ pipenv install -e .
Run Code Online (Sandbox Code Playgroud)

这样您的项目就会添加到 Pipfile 中。


fgo*_*dra 1

使用from ..mod.mods import Objective并保留所有__init__.py文件。