首页 \ 问答 \ 访问Python蛋中的配置文件时出现问题(Problem accessing config files within a Python egg)

访问Python蛋中的配置文件时出现问题(Problem accessing config files within a Python egg)

我有一个Python项目,它具有以下结构:

package1
  class.py
  class2.py
  ...
package2
  otherClass.py
  otherClass2.py
  ...
config
  dev_settings.ini
  prod_settings.ini

我写了一个setup.py文件,将其转换成具有相同文件结构的蛋。 (当我使用zip程序检查它的结构看起来是相同的。)有趣的是,当我从我的IDE运行Python代码时,它工作正常,可以访问配置文件; 但是当我尝试从使用egg的不同Python脚本运行它时,似乎无法在egg中找到配置文件。 如果我把配置文件放到一个与调用 Python脚本相关的目录(蛋的外部),它就可以工作 - 但这种做法违背了拥有一个包含程序所有功能并且可以是从任何地方叫。 只要他们不使用配置文件,我可以使用任何类/模块并运行egg中的任何函数......但如果他们这样做,egg就不能找到它们,所以函数不起作用。

任何帮助将非常感激! 我们对这里的鸡蛋很感兴趣,并不知道从哪里开始。


I have a Python project that has the following structure:

package1
  class.py
  class2.py
  ...
package2
  otherClass.py
  otherClass2.py
  ...
config
  dev_settings.ini
  prod_settings.ini

I wrote a setup.py file that converts this into an egg with the same file structure. (When I examine it using a zip program the structure seems identical.) The funny thing is, when I run the Python code from my IDE it works fine and can access the config files; but when I try to run it from a different Python script using the egg, it can't seem to find the config files in the egg. If I put the config files into a directory relative to the calling Python script (external to the egg), it works - but that sort of defeats the purpose of having a self-contained egg that has all the functionality of the program and can be called from anywhere. I can use any classes/modules and run any functions from the egg as long as they don't use the config files... but if they do, the egg can't find them and so the functions don't work.

Any help would be really appreciated! We're kind of new to the egg thing here and don't really know where to start.


原文:https://stackoverflow.com/questions/3071327
更新时间:2022-01-13 07:01

最满意答案

问题是,配置文件不再是文件 - 它们被封装在蛋中。 在文档中找到答案并不容易,但它在那里。 从setuptools开发人员指南

通常,现有程序会操纵程序包的__file__属性以查找数据文件的位置。 但是,这种操作与基于PEP 302的导入挂钩不兼容,包括从zip文件和Python Eggs导入。

要访问它们,您需要遵循资源管理API的说明。

在我自己的代码中,我有一个日志配置文件的问题。 我成功地使用了这个API:

from pkg_resources import resource_stream

_log_config_file = 'logging.conf'
_log_config_location = resource_stream(__name__, _log_config_file)
logging.config.fileConfig(_log_config_location)
_log = logging.getLogger('package.module')

The problem is, the config files are not files anymore - they're packaged within the egg. It's not easy to find the answer in the docs, but it is there. From the setuptools developer's guide:

Typically, existing programs manipulate a package's __file__ attribute in order to find the location of data files. However, this manipulation isn't compatible with PEP 302-based import hooks, including importing from zip files and Python Eggs.

To access them, you need to follow the instructions for the Resource Management API.

In my own code, I had this problem with a logging configuration file. I used the API successfully like this:

from pkg_resources import resource_stream

_log_config_file = 'logging.conf'
_log_config_location = resource_stream(__name__, _log_config_file)
logging.config.fileConfig(_log_config_location)
_log = logging.getLogger('package.module')

相关问答

更多
  • 问题是,配置文件不再是文件 - 它们被封装在蛋中。 在文档中找到答案并不容易,但它在那里。 从setuptools开发人员指南 : 通常,现有程序会操纵程序包的__file__属性以查找数据文件的位置。 但是,这种操作与基于PEP 302的导入挂钩不兼容,包括从zip文件和Python Eggs导入。 要访问它们,您需要遵循资源管理API的说明。 在我自己的代码中,我有一个日志配置文件的问题。 我成功地使用了这个API: from pkg_resources import resource_stream ...
  • 从我的调查结果可以看出,一些鸡蛋被打包成zip文件,并被保存在Python的site-packages目录中。 这些压缩的蛋需要在执行之前解压缩,因此扩展到PYTHON_EGG_CACHE目录,默认情况下是~/.python-eggs (位于用户的主目录中)。 如果不存在,则在尝试运行应用程序时会导致问题。 有一些修复: 在用户的主目录中创建一个.python-eggs目录,并使其可写入用户。 创建一个解压缩的全局目录(例如/tmp/python-eggs ),并将环境变量PYTHON_EGG_CACHE设 ...
  • 您正在阅读错误的文档。 你想要这样: http : //peak.telecommunity.com/DevCenter/setuptools 在这里的 Python标准库文档的distutils文档中介绍了setup.py。 您的主要区别(对于python鸡蛋)是从setuptools import setup ,而不是distutils 。 是的。 那应该是对的 我不这么认为 pyc文件可以是版本和平台依赖。 你可以打开蛋(他们应该是zip文件),并删除.py文件离开.pyc文件,但不会被推荐。 我不确 ...
  • 我找到了问题,我换了 PARAM_FILE = "data/sensor_display.txt" param_file = pkg_resources.resource_filename("sensor_display", PARAM_FILE) 同 PARAM_FILE = "sensor_display/data/sensor_display.txt" param_file = pkg_resources.resource_filename(pkg_resources.Requirement.par ...
  • 您当前的计划基本上是正确的,或者无论如何都是可行的选择。 当setuptools创建一个egg时,它会检查egg中的代码是否使用了__file__ ,如果是这样,它会将egg标记为不能以压缩形式安装。 这样,当通过easy_install安装egg时,它将被解压缩到.egg/目录而不是保留在.egg文件中。 如果你想支持压缩/ pkg_resources.resource_filename()安装(即,只是将鸡蛋转储到目录而不“安装”它),那么你应该使用pkg_resources.resource_file ...
  • 我想我是这样做的: $ sudo easy_install /usr/local/lib/python2.7/dist-packages/cssutils-1.0-py2.7.egg I think I did it by: $ sudo easy_install /usr/local/lib/python2.7/dist-packages/cssutils-1.0-py2.7.egg
  • 在同一个系统上使用几个版本的Python包的一种方法是virtualenv 。 它通过创建沙箱环境来工作。 所有全局程序包在沙盒环境中都是“可见的”,但您可以在沙箱环境中安装不会影响系统其余部分的新程序包。 我已经成功地使用这种方法来托管单个服务器上的Pylons web应用程序的开发和生产版本。 One way to use several versions of python package on the same system is virtualenv. It works by creating s ...
  • 按顺序回答您的问题。 Python egg是二进制包,包含应用程序的代码和一些元数据。 在这个意义上,它们与debs或rpms没有太大区别。 鸡蛋本身基本上只是一个zip文件,其中包含具有特定名称和布局的所有上述文件。 有关egg(格式及其创建方式)的更多信息,请参阅http://www.ibm.com/developerworks/library/l-cppeak3.html 。 由于python包装的未来(和现在)有点朦胧,所以可能有点过时了。 trac插件是一个python程序,它使用Trac插件AP ...
  • 我发现的第一件事是一个包必须是一个目录。 所以有必要保持这样的结构: my_project/ my_module/ __init__.py output/ create_egg.py test_egg.py 为了跳过指定命令行参数的必要性,有一个特殊选项script_args 。 我在这里找到它: http : //peak.telecommunity.com/DevCenter/setuptools 我的__init__.py : class MyClass: ...

相关文章

更多

最新问答

更多
  • Google会更新重定向网址吗?(Does Google update redirect URLs? [closed])
  • 如何将js-variable从.js文件传递给Electron中的.html页面?(How to pass js-variable from .js file to .html page in Electron?)
  • matlab中的数据处理gui - 从文件和文本框中读取并传递给函数(data handling in matlab gui - reading from file and textbox and pass to function)
  • SVG矩形的笔划宽度在顶部/左侧被切除。(SVG rectangle's stroke widths are cut off on top/left. How do I fix this?)
  • BOOST_CHECK中的错误?(Bug in BOOST_CHECK?)
  • 使用ActiveDocument时记录替换量(Recording the amount of replacements when using ActiveDocument)
  • 将php数组转换为javascript数组(convert php array to a javascript array)
  • 在斯威夫特干邑国际象棋引擎与iOS项目集成(Stockfish Chess Engine Integration with iOS project in Swift)
  • C# - 增加一个双倍值(1.212E + 25)(C# - Incrementing a double value (1.212E+25))
  • 取消asynctask的最佳方法(Best way to cancel asynctask)
  • 文件转换问题的最佳方法(Best approach to File Conversion problems)
  • 从分组数据中选择第一行和最后一行(Select first and last row from grouped data)
  • 哪些元素可以禁用?(What elements can ng-disabled be applied to?)
  • ASP.NET GridView在回发时为空(ASP.NET GridView empty on postback)
  • lua环境和模块(lua environments and modules)
  • 如何将小切片复制到更大切片的末尾(How to copy a small slice to the end of a bigger slice)
  • IIS7 URL重写模块替换(IIS7 URL Rewriting Module Replace)
  • IE和Google Chrome中的多表单提交(Multi-forms submission in IE and Google chrome)
  • Symfony2:如何在控制器中检索UserChecker?(Symfony2: How to retrieve the UserChecker in a controller?)
  • 循环通过数组和删除项目,而不破坏循环(Looping through array and removing items, without breaking for loop)
  • 如何动态更改YouTube播放器的选项(How to dynamically change YouTube player's options)
  • Laravel使用以点开头的文件处理存储磁盘(Laravel working through storage disk with files starting with dot)
  • 在挂架中使用重定向时出错(Error using redirect in pylons)
  • 替换netCDF文件中的变量(Replacing a variable inside a netCDF file)
  • 让swable中的非可变数组(let Non-mutable array in swift)
  • 春季安全缺省登录页面代码位于何处?(Where is spring security default login page code located?)
  • Unix - 并排打印公共线(Unix - Print Common Lines side by side)
  • 验证TimeSpan(Validating TimeSpan)
  • 如果还有一个具有返回值的重载版本,如何正确调用非返回值Swift函数?(How do I properly call a non-return-value Swift function when it also has an overloading version that has returned value?)
  • Perl:比较两个文件并打印匹配和不匹配的数据(Perl: Comparing two files and printing data that match and don't match)