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.mods和import 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?我已经尝试了以下方法:
from ..mod.mods import Objective到run_simulation.py使用具有以下内容的init .py 文件:import os, sys sys.path.append(os.path.dirname(os.path.realpath(__file__)))
没有__init__.py文件
编辑:我从我在父目录中开始的 Visual Studio 代码运行该文件。我还尝试从我使用的 sim 文件夹中的 windows 命令行
python run_simulation.py
Run Code Online (Sandbox Code Playgroud)
我处理项目内部导入的方法是以可编辑模式安装项目。这样,所有文件都能够相互定位,始终从项目根目录开始。
为此,请按照下列步骤操作:
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 中。