我在这里遇到了一些麻烦。我有一个python脚本(gather.py),它从一个.xml文件中收集信息,并在一个无限循环中上传至数据库,睡眠时间为60秒;另外,这些都是本地的。我正在使用Flask来运行一个网页,该网页随后将从数据库中获取信息,但目前它所做的只是显示一个样本页面(main.py)。我想运行main.py,让它把gather.py作为后台进程启动,这样就不会妨碍Flask的启动,我试着导入gather.py,但是它停止了进程(无限期),Flask也不会启动。在谷歌搜索了一段时间后,似乎最好的选择是使用一个任务队列(Celery)和一个消息中介(RabbitMQ)来处理这个问题。如果应用程序要在后台做很多事情,这很好,但我只需要它做1或2件事情。所以我做了更多的调查,发现有帖子说
subprocess.Popen()
可以做这个工作。我试着使用它,我认为它没有失败,因为它没有引发任何错误,但数据库是空的。我确认gather.py和main.py都能独立工作。我试着在IDLE中运行下面的代码。
subprocess.Popen([sys.executable, 'path\to\gather.py'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
并得到这样的回报。
<subprocess.Popen object at 0x049A1CF0>
现在,我不知道这意味着什么,我试着用
.value
和
.attrib
,但可以理解的是我得到了这个。
AttributeError: 'Popen' object has no attribute 'value'
AttributeError: 'Popen' object has no attribute 'attrib'
然后我在StackOverflow的帖子上看到,
stdout=subprocess.PIPE
会导致程序停止,所以,在 "以防万一 "的时刻,我运行了。
subprocess.Popen([sys.executable, 'path\to\gather.py'], stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT)
并得到这样的回报。
<subprocess.Popen object at 0x034A77D0>
在所有这些过程中,数据库表一直是空的。我是
subprocess
模块的新手,但所有这些检查,我都搞不清楚为什么它不能运行gather.py。是不是因为它有一个无限的循环?如果有更好的选择,请告诉我。
Python version: 3.4.4
PS.不知道这是否重要,但我在Windows 10 PC上运行的是Python的便携版本(PortableApps)。这就是为什么我把
sys.executable
包含在
subprocess.Popen()
里面。