【问题标题】:Reliable way to get path to py file of a module获取模块py文件路径的可靠方法
【发布时间】:2012-12-19 19:10:43
【问题描述】:

我正在尝试找出在运行时可靠地发现给定模块的 py 文件在文件系统上的位置的最佳方法。我需要这样做,因为我计划将有关某些方法的一些配置数据(在这种情况下,用于验证来自在模块中定义的接口的服务调用的响应的模式)外部化,以保持清洁和易于维护。

系统的简化说明:

package
|
|-service.py
|
|-call1.scm
|
|-call2.scm

service.py(_call() 是基类上的一个方法,尽管这与问题无关)

class FooServ(AbstractService):
    def call1(*args):
        result = self._call('/relative/uri/call1', *args)
        # additional call specific processing
        return result
    def call2(*args):
        result = self._call('/relative/uri/call2', *args)
        # additional call specific processing
        return result

call1.scm 和 call2.scm 定义响应模式(在当前情况下,使用草案 JSON 模式格式,但同样与问题无关)

在代码库的另一个地方,当实际进行服务调用时,我希望能够检测到service.py 的位置,以便我可以遍历文件结构并找到scm 文件。至少在我的系统上,我认为这会起作用:

# I realize this is contrived here, but in my code, the method is accessed this way
method = FooServ().call1
module_path = sys.modules[method.__self__.__class__.__module__].__file__
schema_path = os.path.join(os.path.dirname(module_path), method.__name__ + '.scm')

但是,我想确保这在所有平台和安装配置上都是安全的,我在进行研究时遇到了this,这让我担心尝试以这种方式执行此操作不会可靠地工作。这会普遍有效,还是模块对象上的__file__ 返回pyc 文件的位置这一事实,该位置可能位于py 文件旁边以外的某个位置,这会使该解决方案无效?如果它会使其无效,我可以做什么(如果有的话)?

【问题讨论】:

    标签: python cross-platform relative-path file-location


    【解决方案1】:

    在你链接的PEP 中,它说:

    在 Python 3 中,当您导入模块时,其 __file__ 属性指向其源 py 文件(在 Python 2 中,它指向 pyc 文件)。

    所以在 Python 3 中你很好,因为 __file__ 将始终指向 .py 文件。在 Python 2 中,它可能指向 .pyc 文件,但对于 Python 2,.pyc 只会与 .py 文件位于同一目录中。


    好的,我想你指的是这一点:

    因为这些发行版不能共享 pyc 文件,所以已经开发了复杂的机制来将生成的 pyc 文件放在非共享位置,同时仍然共享源代码。示例包括基于符号链接的 Debian 制度 python-support [8] 和 python-central [9]。这些方法使得将 Python 应用程序交付给广泛的用户的策略变得更加复杂、脆弱、难以理解和碎片化。

    我相信这些机制仅适用于发行版打包的 Python 模块。我不认为它们应该影响在发行版的打包系统之外手动安装的模块。为该发行版打包您的模块的人有责任确保该模块不会被该机制破坏。

    【讨论】:

    • 我使用的是 Python 2.7。我更担心的是大量文本谈论各种解释器和操作系统配置处理 pyc 文件生成的随意和不一致的方式。
    • 致您的编辑:这是有道理的。我想我会尝试追踪 Mac 和其他几个平台,看看那里发生了什么,但我更有信心现在一切都会好起来的。谢谢。
    • 我确认所有对我很重要的平台都是如此,所以我认为我很好。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2019-01-27
    • 2014-10-14
    • 2013-02-19
    • 2023-04-03
    • 2016-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多