我为其创建了项目和辅助模块。但有些模块互相使用,比如worker 1 使用helper1,helper2 也使用helper1。所以我完全困惑我需要如何导入所有这些模块,以便可以独立工作(例如我想从主脚本中调试 helper2)并且它们仍然可以正常工作。总结 - 如何正确导入模块,以便 maint_script 在使用 main_script 时可以工作以及其他模块。对不起我的英语。
main program dir/ main_script.py -classes/ | |--helper1.py |--helper2.py -worker_classes/ | |--worker1.py
目前我在每个脚本的请求中使用这种结构,但我觉得这种方法不适合 python
import os
import sys
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), 'shell_modules')))
最佳答案
我处理项目内部导入的方式是以可编辑模式安装项目。这样,所有文件都能够相互定位,始终从项目根目录开始。
为此,请按照下列步骤操作:
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) 您的文件现在能够相互定位,始终从项目根目录开始。例如,要导入 helper1.py
,您可以编写:
from classes import helper1
或者:
from classes.helper1 import foo, bar
对于任何文件导入 helper1.py
都是如此,无论它位于项目结构中的哪个位置。
就像我说的,你应该为此使用虚拟环境,这样 pip 就不会将你的包安装到你的主要 Python 安装中(如果你的项目有很多依赖项,这可能会很困惑)。
目前我最喜欢的工具是 pipenv 。使用时将终端命令替换为
$ pipenv install -e .
这样您的项目就会添加到 Pipfile 中。
关于python - 与 python import (绝对和相对)混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56442405/