在Pyramid框架中运行脚本(即不通过服务器)

4 投票
4 回答
4162 浏览
提问于 2025-04-16 18:47

我对PHP框架和Python脚本有一定的经验,现在想尝试一下Pyramid这个框架。

我想知道在Pyramid中运行脚本的“正确”方式是什么。也就是说,我应该如何设置,让这个脚本成为应用程序的一部分,能够访问配置和数据库,但又不通过paster(或者其他WSGI)来运行。

举个例子,假设我有一个网页应用,当用户离线时,它会通过一个网络服务获取Facebook的更新。我想写一个脚本来定期访问这个服务,并把数据存储到数据库中,以便用户下次登录时可以看到。

在这方面,我应该怎么做呢?

  1. 在ini文件中添加变量
  2. 正确启动脚本

我了解Python模块和包的基本知识,但对Configurator/Paster/包的设置还不是很明白,我觉得答案可能在这里面。

谢谢

更新:

谢谢,这看起来是我想要的方向。我注意到你必须遵循一定的结构(例如,设置summary和parser属性),而且调用的函数command()会始终被执行。我的测试代码现在看起来像这样:

class AwesomeCommand(Command):

max_args = 2
min_args = 2

usage = "NAME"
# These are required
summary = "Say hello!"
group_name = "My Package Name"
# Required:
parser = Command.standard_parser(verbose=True)


def command(self):

    # Load the config file/section
    config_file, section_name = self.args
    # What next?

我现在卡在如何获取设置本身上。例如,在init.py中,你可以这样做:

 engine = engine_from_config(settings, 'sqlalchemy.')

我需要做什么才能把配置文件转换成设置呢?

编辑:在Pylons中,有一种(更简单的)方法可以做到这一点,链接在这里: 将Pylons控制器作为单独的应用运行?

4 个回答

1

我在讨论区看了关于pylons的内容,想到了一个答案。希望这个能帮到某个人:

 #Bring in pyramid application--------------------------------------

 import pyramid
 from paste.deploy import appconfig
 config_file = '/path_to_config_file/configname.ini'

 name = 'app_name'
 config_name = 'config:%s' % config_file
 here_dir = os.getcwd()

 conf = appconfig(config_name, name, relative_to=here_dir)

 from main_package import main
 app = main(conf.global_conf, **conf.local_conf)

 #--------------------------------------------------------------------------
1

paster 是一个工具,它可以根据一个 ini 文件来启动应用程序,这个 ini 文件里描述了应用的各种信息。里面的 "serve" 命令是一个内置命令,用来启动一个 wsgi 应用并提供服务。不过,你也可以自己写其他的 命令

from paste.script.command import Command
class AwesomeCommand(Command):
    def command(self):
        print "the awesome thing it does"

然后把这些命令注册为你的 setup.py 文件中的入口点。

setup(...
entry_points="""
  [paste.app_factory]
  .....

  [paste.global_paster_command]
  myawesome-command = mypackage.path.to.command:AwesomeCommand    """)

像 pyramid 这样的框架也会通过这种方式添加自己的命令,比如 pshell命令

2

从Pyramid 1.1版本开始,这个问题由框架自己处理了:

http://docs.pylonsproject.org/projects/pyramid/en/latest/narr/commandline.html#writing-a-script

撰写回答