【问题标题】:Preferred way to resolve package root in Python在 Python 中解析包根的首选方法
【发布时间】:2016-01-15 01:47:43
【问题描述】:

我知道以下方法可以确定模块正在执行的目录:

os.path.dirname(os.path.abspath(__file__))

现在假设我有一个包含一些模块的包,这些模块需要读取位于子目录中的文本文件。像这样的:

|-- package
|   |-- __init__.py
|   |-- module1.py
|   |-- subdirectory1
|   |   |-- module2.py
|   |-- subdirectory2
|   |   |-- file.txt

假设我不想使用文件的相对路径。我的直觉是,最好在包根目录中的某处定义一个全局变量,该变量提供包的绝对路径(例如上面的代码行),并且可以在需要引用文件时由不同的模块导入包内。但是这个变量会去哪里呢?在它自己的模块中?还是让每个模块获取自己的绝对路径,从中获取包根目录,然后附加到文件的位置更好?

编辑:另一个想法是将其存储在os.environ 中并让模块从那里获取它。也许将以下行放在顶层__init__.py

os.environ['MY_PACKAGE_ROOT'] = os.path.dirname(os.path.abspath(__file__))

【问题讨论】:

    标签: python organization project-organization


    【解决方案1】:

    您应该使用导入系统。 subdirectory1subdirectory2 也应该是包(您可以通过向它们添加 __init__.py 文件来制作它们,然后您可以使用 Python 的正常导入机制来引用模块:

    import package.module1
    import package.subdirectory1.module2
    import package.subdirectory2.file
    

    等等。

    【讨论】:

    • 在我的原始帖子中并不清楚该文件不是模块 - 它是其他类型的文件,如文本文件,因此此解决方案不起作用。对问题进行了编辑以反映这一点。
    • 您仍然可以使用import 系统来执行此操作。在 subdirectory2 中创建一个 python 文件,该文件返回指向其当前目录中文件的文件名或文件指针,例如:from package.subdirectory.file import filenamesubdirectory2/file.pyfilename = os.path.abspath("file.txt")
    • 请注意,导入没有 _ init _.py 的子目录会成为命名空间包,对路径信息有影响。
    【解决方案2】:

    获取包的路径:

    os.path.dirname(sys.modules['__main__'].__file__
    

    或者如果包是自己导入的:

    os.path.dirname(sys.modules['package']).__file__
    

    我自己没有使用过命名空间包及其对应的路径。

    有时我希望当人们询问 Python 中的“路径”内容时,我希望他们能够在 Python 模块路径“package.subpackage.module”与操作系统的文件名路径“.\package\subdirectory\module”之间进行描述.py"

    设置了_ path _ 属性也可以查看Python的文档。

    【讨论】:

      猜你喜欢
      • 2019-04-28
      • 1970-01-01
      • 2014-05-28
      • 2016-08-31
      • 1970-01-01
      • 2011-04-02
      • 2013-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多