【问题标题】:Using package files from script使用脚本中的包文件
【发布时间】:2017-02-07 20:38:40
【问题描述】:

如果我的 Python 包中有一个脚本,我如何让它从包中读取其他文件,因为__file__ 包含(例如)/usr/bin/myscript 而不是/usr/lib/python3.3/site-packages/mypackage/myscript

(这些文件只是模板,而不是模块。)

【问题讨论】:

    标签: python package distutils


    【解决方案1】:

    任何基于路径名的方法都不起作用,因为您的包或整个站点包可能是一个 zip 文件,或者文件可能已安装在包内以外的其他位置,等等。

    pkgutil 模块,尤其是 get_data 函数,是获取作为包一部分的数据文件内容的 stdlib 方法。

    请参阅Installing Package DataInstalling Additional Files,了解有关确保文件最终确实最终存在的更多信息。

    如果您想使用setuptools 而不仅仅是标准库,pkg_resources 可以让事情变得更容易/更灵活。

    【讨论】:

    • 嗯……在安装附加文件之后将事情正确地放入/usr。有没有办法把它放在与包裹更相关的地方?
    • @minitech:当然;这些是相对路径,所以你可以只做'share/myapp/foo' 而不是'foo'。尝试以平台友好的方式为每个平台做到这一点并不是那么有趣。如果您需要任何复杂和跨平台的东西,请使用 setuptools
    • 我确实需要跨平台的东西;我将如何使用 setuptools?它似乎没有将文件放在任何地方。
    • @minitech:你读过文档吗? Including Data Files 和以下三个部分解释了它是如何工作的。我仍然不确定您是在尝试安装包数据文件,还是附加文件/非包数据文件,所以我不知道如何告诉您该阅读哪一个;只需阅读它们,也许您就会知道您想要什么。最后,“它似乎没有将文件放在任何地方”不是任何人都可以帮助您的事情。我真的不知道你尝试了什么,或者发生了什么……
    • 我阅读了这两个文档并包含了package_data。它应该在哪里安装文件?
    【解决方案2】:

    你可以使用setuptools中的ResourceManager API'pkg_resources

    import pkg_resources
    my_stream = pkg_resources.resource_stream(__name__, "foo.dat")
    

    例如将my.package/my/package/foo.dat作为类文件对象my_stream打开。

    这适用于普通鸡蛋和带拉链的鸡蛋。但是请注意,这需要安装 setuptools。对于仅使用标准库的解决方案(这是首选),请参阅@abarnert 的答案。

    【讨论】:

      猜你喜欢
      • 2011-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多