我打算让项目具有以下结构:
./runme.py
./my_modules/__init__.py
./my_modules/global_imports.py
./my_modules/user_defined_functions.py
想法是将重要变量存储在global_imports.py
中,使用runme.py
将它们导入from my_modules.global_imports import *
(我知道以这种方式导入模块是一种不好的做法,但我保证在那里将只是几个没有碰撞名称的变量)
四个问题:
global_imports.py
中包含的两个变量应为SCRIPT_PATH
和SCRIPT_DIR
。我已尝试SCRIPT_PATH = os.path.realpath(__file__)
和SCRIPT_DIR = os.path.dirname(SCRIPT_PATH)
,但它返回global_imports.py
的路径(目录)而不是runme.py
。如何获取runme.py
的路径(目录)?
在global_imports.py
内部我可能会导入os
和sys
等模块。我还需要在runme.py
内导入这些模块。当模块首先从另一个模块导入,然后从主脚本导入,反之亦然时,这是否会被视为问题?
是否可以将global_imports.py
中的变量导入user_defined_functions.py
?我认为这是一种不好的做法,我只是好奇。
有没有更好的方法将项目分成模块?
答案 0 :(得分:0)
按顺序解决您的问题:
在第一个变量SCRIPT_DIR中,您将获得文件global_imports.py的完整路径,如下所示:
SCRIPT_PATH = '/home/../../my_project/my_modules/global_imports.py'
现在为了获取runme.py的目录,我们应该考虑另一个变量:
SCRIPT_PATH_DIR = os.path.dirname(SCRIPT_PATH)
这将为我们提供路径
SCRIPT_PATH_DIR = '/home/../../my_project/my_modules/'
现在要访问包含runme.py的父目录,我们可以这样:
SCRIPT_DIR = os.path.abspath(os.path.join(SCRIPT_PATH_DIR, os.pardir))
现在,SCRIPT_DIR给出了runme.py的路径,即:
SCRIPT_DIR = '/home/../../my_project/'
根据我们的项目结构,runme.py应仅确定对主模块的导入,然后命令运行该应用程序。因此,它不应包含任何其他导入。仍然如果你需要使用一个模块然后在runme.py中明确地导入它,因为Python的一个禅说“明确比隐含更好”
是的,有可能,你可以这样做:
from .global_imports import variable_name
但一般来说,你应该在' /../ my_project /'中使用单独的config.py或settings.py文件。目录,其中应包含您可能需要在项目中的任何位置使用的所有设置和变量。
就我所见,这种方法已经足够好了。您的主项目目录包含runme.py和项目中使用的其他模块。 ' my_modules'是我认为的模块之一。您可以在项目目录中包含更多此类模块。更好的方法是仅在其中一个模块(例如my_modules)中包含设置和配置,并为其提供其他模块。
希望这有帮助,如果有什么不清楚,请发表评论。