Python 2.7 读取存储在.ini文件中的信息

Python 2.7 读取存储在.ini文件中的信息,python-2.7,pyramid,Python 2.7,Pyramid,我正在用Python编写一个金字塔应用程序,我有几个脚本都需要development.ini中的相同信息 如何从development.ini获取信息并将其分配给另一个脚本中的变量?这样我就可以拿这个了 # development.ini [app:main] some.url = some_url [other_thing] info.partA = some_info info.partB = some_other_info 把它变成这个 # some_script.py url =

我正在用Python编写一个金字塔应用程序,我有几个脚本都需要development.ini中的相同信息

如何从development.ini获取信息并将其分配给另一个脚本中的变量?这样我就可以拿这个了

# development.ini

[app:main]
some.url = some_url

[other_thing]
info.partA = some_info
info.partB = some_other_info
把它变成这个

# some_script.py

url = some_url
infoA = some_info
infoB = some_other_info
解决方案使用
defmain(全局配置,**设置):
,但这对我来说毫无意义。 页面使用
ConfigParser.ConfigParser()
,但我也不能让它工作

我对这方面还不太熟悉,所以请你尽可能清楚地说出来好吗

这个页面的解决方案使用defmain(全局配置,**设置):,但这对我来说毫无意义

发件人:

请注意,作为**设置传递给Configurator构造函数的值的扩展版本将在金字塔视图可调用代码中作为request.registry.settings提供。您可以通过查看代码创建希望稍后访问的对象,并将它们作为设置放入传递给configurator的字典中。然后,它们将在应用程序运行时出现在request.registry.settings字典中

在所使用的
ini
文件中
[app:main]
中设置的变量可通过
request.registry.settings
dict在应用程序中访问


好问题。金字塔可以使用PasteDeploy配置文件进行应用程序配置。因此,它提供了这样的机会。假设您想在首次运行Web应用程序之前设置数据库表,或者有一个日常运行的维护脚本。您希望两个脚本也从development.ini/production.ini获取连接字符串。这被认为是良好的做法

这是一个常见的
yourwebapp.\uuuuu init\uuuuuuuuuy
你已经知道了。通过运行
bin\pserve development.ini

from pyramid.config import Configurator

from sqlalchemy import engine_from_config

from .models import DBSession, Base

def main(global_config, **settings):
    engine = engine_from_config(settings, 'sqlalchemy.')
    DBSession.configure(bind=engine)
    Base.metadata.bind = engine

    config = Configurator(settings=settings,
                          root_factory='tutorial.models.Root')
    config.include('pyramid_chameleon')
    config.add_route('wiki_view', '/')
    config.add_route('wikipage_add', '/add')
    config.add_route('wikipage_view', '/{uid}')
    config.add_route('wikipage_edit', '/{uid}/edit')
    config.add_static_view('deform_static', 'deform:static/')
    config.scan('.views')
    return config.make_wsgi_app()
要在另一个脚本中访问您的应用程序配置,可以说
some_script.py
,也可以使用pyramid.paster中的方法读取设置并从设置中初始化日志记录

from sqlalchemy import engine_from_config

from pyramid.paster import (
    get_appsettings,
    setup_logging,
    )

from .models import (
    DBSession,
    Base,
    )

def do_your_stuff(settings)
    "your custom script logic that extracts a certain settings and does something"




def main(argv=sys.argv):
    config_uri = argv[1]
    setup_logging(config_uri)
    settings = get_appsettings(config_uri)
    engine = engine_from_config(settings, 'sqlalchemy.')
    DBSession.configure(bind=engine)
    Base.metadata.create_all(engine)
    do_your_stuff(settings)
要连接所有需要的内容,请在setup.py中为命令行脚本添加入口点。仔细阅读
控制台脚本
部分。为脚本定义一个名称,并指向some_script.py的“main”函数。这是您需要为每个应用程序和脚本自定义的目标

from setuptools import setup

requires = [
    'pyramid',
    'pyramid_chameleon',
    'deform',
    'sqlalchemy',
    'pyramid_tm',
    'zope.sqlalchemy'
]

setup(name='tutorial',
      install_requires=requires,
      entry_points="""\
      [paste.app_factory]
      main = tutorial:main
      [console_scripts]
      initialize_db = yourwebapp.some_script:main
      """,
)
由于更改了setup.py,您需要运行下面的命令来创建控制台脚本,该脚本将在“bin”文件夹中找到(与您调用pserve的文件夹相同)。我想当然地认为他们在运行一个虚拟电视

$ $VENV/bin/python setup.py develop
之后,可以使用配置文件运行脚本

$ $VENV/bin/initialize_db development.ini
在生产中,获取另一个配置文件。这就是美

$ $VENV/bin/initialize_db production.ini
一些第三方库提供了由粘贴器配置文件驱动的特殊帮助函数(工厂)。例如sqlalchemy,pyramid.zodbconn通常有名称为
*\u from_config(settings)
的方法

参考资料

我试着让你穿短一点。注意其他金字塔应用程序中的粘贴部署主题和pyramid.paster内容

import ConfigParser
config = ConfigParser.ConfigParser()
config.read("development.ini")

dConfig = config.__dict__['_sections'].copy()

url = dConfig['app:main']['some.url']
infoA = dConfig['other_thing']['info.partA']
infoB = dConfig['other_thing']['info.partB']
现在等于

url = some_url
infoA = some_info
infoB = some_other_info
如果
东西处于
development.ini
production.ini
[app:main]
中,则:

info=self.request.registry.settings[“info”]

您可以使用

设置中有一个“mongo_uri”示例

settings/development.ini:

[app:main]
use = egg:gps_tracker
mongo_uri = mongodb://localhost:27017/gps
db.py:

from urllib.parse import urlparse
import pymongo

def includeme(config):
    settings = config.get_settings()
    mongo_db_url = urlparse(settings['mongo_uri'])
    settings['mongo_db_url'] = mongo_db_url
    settings['mongo_db_name'] = mongo_db_url.path[1:]
    settings['mongo_hostname'] = mongo_db_url.hostname
    settings['mongo_port'] = int(mongo_db_url.port or 27017)

    connection = pymongo.MongoClient(host=mongo_db_url.hostname,
                                     port=mongo_db_url.port)
    config.registry.mongo_connection = connection

我建议将重点放在
ConfigParser.ConfigParser()
的问题上。这有什么问题?这个答案提供了一个很好的ConfigParser使用示例:对于使用PasteDeploy的金字塔框架,使用Python的ConfigParser模块可能是一种太低级的方法,会导致出现错误。pyramid.paster为*.ini文件中的内容提供了适当的抽象。我认为OP有一个脚本,他们希望从pyramid应用程序使用的
.ini
文件中访问一些信息,例如,连接到同一个数据库。脚本中不会有任何
请求.注册表.设置
。啊,是的。我试过一次阅读理解,很难。谢谢你的更正。如果这对你目前的发展有用的话,那就试试吧。请记住我稍后在将应用程序部署到Linux/Windows系统时的回答。然后,PasteDeploy控制台脚本变得非常有用。您只需使用setuptools安装软件包,脚本(或Windows上的*.exe)即可进入
bin
文件夹。令人惊叹的。