【问题标题】:Python - running script is in an egg?Python - 运行脚本在鸡蛋里?
【发布时间】:2012-08-05 12:34:33
【问题描述】:

我创建了一个可执行的 egg 以使其作为单个文件可执行。

setup.py

#!/usr/bin/env python
from setuptools import setup, find_packages

setup(
    name='app',
    version='0.5',
    description='foo',
    author='microo8',
    author_email='xxx@email.com',
    packages=["foo", "bar"],
    install_requires=["sqlalchemy>=0.7", "paramiko>=1.7.7.1"],
    entry_points = {
        'setuptools.installation': [
            'eggsecutable = foo.module:main',
        ]
    }
)

我现在可以称它为:./app-0.5-py2.7.egg,但相对路径都在鸡蛋中。 当我在main 函数中调用print __file__ 时,它会打印/home/user/app-0.5-py2.7.egg/foo/module.py。我想读取一个配置文件,它必须与鸡蛋在同一个目录中。并且相同的脚本必须也可以作为“非鸡蛋”执行,因此配置文件将与脚本一起在目录中。

我怎样才能知道脚本是从鸡蛋和鸡蛋路径中执行的?

【问题讨论】:

    标签: python egg


    【解决方案1】:

    您应该使用ResourceManager API 加载配置文件。这样,您的蛋化代码即使在压缩时也可以加载配置文件。

    import pkg_resources
    configdata = pkg_resources.resource_string(__name__, "myconfigfile.cfg")
    

    API 可以检查是否存在、测试目录、读取数据或为您提供鸡蛋中任何资源的打开文件对象。

    API 负责处理所有细节;它会将文件提取到一个临时目录,例如,如果您绝对必须有一个资源的文件名,但从一个压缩的鸡蛋中运行。

    最重要的是,无论您实际上是作为鸡蛋安装还是独立安装,它都可以工作。

    【讨论】:

    • 但我希望配置文件必须是可编辑的,而不是压缩在鸡蛋中
    • 那是一个单独的问题;你可以通过在 setup.py 中设置 zip_safe = False 来配置你的 egg 不被压缩。尽管期望人们更改您的 python 包中的配置,但这通常是一个坏主意;改用命令行选项(打开 CL 或允许将路径传递给配置文件)。
    • 这可能一文不值,因为这是 resource_*() 系列函数搜索相对于指定模块而不是鸡蛋本身的路径的顶级结果;所以关于 setuptools 这是你用 package_data 指定的东西。
    【解决方案2】:

    所以我不知道如何检查运行脚本是否在鸡蛋中,但是可以通过以下方式获取配置文件路径:os.path.realpath('config.cfg')

    这适合我,当我有一个包含可执行文件和配置文件的目录时,这是一个正确的路径。

    另外,当我在目录中只有脚本和配置文件时,它也是正确的。

    当我使用pyinstaller 创建单个文件时。

    【讨论】:

      猜你喜欢
      • 2017-03-08
      • 2016-03-03
      • 2018-06-03
      • 2010-10-21
      • 2011-02-13
      • 2019-02-21
      • 2011-01-02
      • 1970-01-01
      • 2013-05-22
      相关资源
      最近更新 更多