正确设计Python项目

时间:2016-04-29 10:30:13

标签: python module

我打算让项目具有以下结构:

./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 *(我知道以这种方式导入模块是一种不好的做法,但我保证在那里将只是几个没有碰撞名称的变量)

四个问题:

  1. global_imports.py中包含的两个变量应为SCRIPT_PATHSCRIPT_DIR。我已尝试SCRIPT_PATH = os.path.realpath(__file__)SCRIPT_DIR = os.path.dirname(SCRIPT_PATH),但它返回global_imports.py的路径(目录)而不是runme.py。如何获取runme.py的路径(目录)?

  2. global_imports.py内部我可能会导入ossys等模块。我还需要在runme.py内导入这些模块。当模块首先从另一个模块导入,然后从主脚本导入,反之亦然时,这是否会被视为问题?

  3. 是否可以将global_imports.py中的变量导入user_defined_functions.py?我认为这是一种不好的做法,我只是好奇。

  4. 有没有更好的方法将项目分成模块?

1 个答案:

答案 0 :(得分:0)

按顺序解决您的问题:

  1. 在第一个变量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/'
    
  2. 根据我们的项目结构,runme.py应仅确定对主模块的导入,然后命令运行该应用程序。因此,它不应包含任何其他导入。仍然如果你需要使用一个模块然后在runme.py中明确地导入它,因为Python的一个禅说“明确比隐含更好”

  3. 是的,有可能,你可以这样做:

    from .global_imports import variable_name
    

    但一般来说,你应该在' /../ my_project /'中使用单独的config.py或settings.py文件。目录,其中应包含您可能需要在项目中的任何位置使用的所有设置和变量。

  4. 就我所见,这种方法已经足够好了。您的主项目目录包含runme.py和项目中使用的其他模块。 ' my_modules'是我认为的模块之一。您可以在项目目录中包含更多此类模块。更好的方法是仅在其中一个模块(例如my_modules)中包含设置和配置,并为其提供其他模块。

  5. 希望这有帮助,如果有什么不清楚,请发表评论。