【问题标题】:How to import modules from parent sub-directory如何从父子目录导入模块
【发布时间】:2019-11-10 09:29:30
【问题描述】:

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

│   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

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

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

    def __init__(self, x):
        self.x = x

文件sim/run_simulation.py 包含:

from mod.mods import Objective

x = 5
obj = Objective(x)

当我尝试运行它时,我收到以下错误:

  File "sim/run_simulation.py", line 1, in <module>
    from mod.mods import Objective
ModuleNotFoundError: No module named 'mod'

在 Visual Studio 代码中,当我开始输入 mod.modsimport Objective 时,它会自动填充

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

from mod.mods import Objective

x = 5
obj = Objective(x)

print(obj.x)

如何从目录sim 执行此操作?我已经尝试了以下方法:

  1. 使用from ..mod.mods import Objective 运行_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

【问题讨论】:

  • @user3223765 你能说出你使用项目的方式吗,即从哪里运行 run_simulations.py 文件?表示您如何在终端中运行它
  • 我从父目录开始的 Visual Studio 代码运行文件。

标签: python python-import


【解决方案1】:

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

为此,请按以下步骤操作:

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

# setup.py
from setuptools import setup, find_packages

setup(name='MyPackageName', version='1.0.0', packages=find_packages())

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

$ pip install -e .

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

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

from mod.mods import Objective

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

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

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

$ pipenv install -e .

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

【讨论】:

  • 感谢您的详尽解释!我尝试了你所说的并使用了'setup(name ='Objective',version ='1.0.0',packages = find_packages())'我运行了pip命令并创建了一个名为Objective.egg-info的文件夹。但这并不能解决我的问题..
【解决方案2】:

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

【讨论】:

  • 我的错,OP 中有错字。我已经尝试过 ..mod.mods
【解决方案3】:

我确实通过将其添加到系统路径中找到了一种解决方案:

import os
import os.path
import sys

sys.path.append(os.getcwd() + "\\mod")

from mods import Objective

x = 5
obj = Objective(x)

print(obj.x)

这行得通,但我无法想象这真的是它的意图..

编辑:以下内容更笼统:

import os
import sys

sys.path.append(os.getcwd())

from mod.mods import Objective

x = 5
obj = Objective(x)

print(obj.x)

有些东西告诉我这可以更容易地完成,但我不知道如何..

【讨论】:

    猜你喜欢
    • 2015-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-31
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    相关资源
    最近更新 更多