Python 使用RQ工作者、队列和作业时,管理路径的正确方法是什么

Python 使用RQ工作者、队列和作业时,管理路径的正确方法是什么,python,sqlalchemy,task-queue,python-rq,Python,Sqlalchemy,Task Queue,Python Rq,我的第一个问题/帖子。。。请善待 我正在从事一个个人项目,其中一个模块在循环中运行,收集数据。当数据进入时,它将数据插入数据库的操作交给队列中的一个函数,在队列中,侦听rq工作人员拾取数据并处理该函数。数据库使用SQLAlchemy进行管理,这意味着它必须生成引擎、会话并定义数据库表 代码文件的结构是: --/home/..../collect-view/ (this is the project folder) -- DataCollection -- main_cl

我的第一个问题/帖子。。。请善待

我正在从事一个个人项目,其中一个模块在循环中运行,收集数据。当数据进入时,它将数据插入数据库的操作交给队列中的一个函数,在队列中,侦听rq工作人员拾取数据并处理该函数。数据库使用SQLAlchemy进行管理,这意味着它必须生成引擎、会话并定义数据库表

代码文件的结构是:

--/home/..../collect-view/  (this is the project folder)
    -- DataCollection
        -- main_client.py  (main loop waiting for user data)
        -- collect_data.py (contains the database insertion function)
        -- base.py         (the base file for SQLAlchemy database definition)
        -- tables.py       (the file which sets up the table name and definition)
    -- app.db                  (the database file)
注意:数据库文件位于更高级别的目录中,因为它也被另一个同样位于该级别的应用程序(Flask app)访问

要实现这段代码,“collect_data”必须导入“base”,而“tables”和“tables”必须导入“base”。这被证明是一个问题,因为一旦collect_data函数(称为“transfer”)由worker运行,它就再也找不到要导入的文件,worker抛出一个异常,说它无法导入“base”。我在网上搜索答案,最终在Github上从nvie找到了答案,其中提到使用--path选项将工作人员引导到正确的路径。我通过实施以下措施使其发挥作用:

$ rq worker rq_worker_data2db --path /home/../../collect_view/DataCollection
然后,我遇到了另一个与路径相关的故障,工作人员说它找不到我试图插入数据的数据库表。所以我改变了引擎创建步骤,也包括了我的完整路径

base_url = '/home/.../collect_view/'
engine = create_engine ('sqlite:///' + base_url + 'app.db')
这个问题让我更加困惑,因为我的工作人员已经在我的数据收集目录中工作了,所以我认为:sqlite:///../app.db“)将是定位数据库的正确方法(就像在没有rq工作者的情况下进行测试时一样)

所以,经过长时间的解释,我的问题是:在这种情况下,管理路径的正确方法是什么?在我看来,我必须使用我从/回家的完整路径是错误的。。。我是否遗漏了一些关于路径和/或rq worker(以及类似的)如何工作的信息

我的代码文件摘录如下:

main_client.py

收集_data.py

base.py

tables.py

在终端中,我首先让Redis运行,然后使用以下命令运行worker:

$rq-worker-rq\u-worker\u-data2db--path/home/./../collect\u-view/DataCollection
(其中rq_worker_data2db是工作者名称)

@snakecharmerb。关于rq工作程序的工作目录,您是正确的。我从完整路径更改为“./DataCollection”(我在“collect\u view”文件夹中启动rq worker),代码的工作原理与使用完整路径时相同。到目前为止还不错。但是,sqlalchemy引擎定义中使用的sqlite数据库的位置仍然是一个问题。在base.py中使用“os.getcwd()”表明base.py是在cwd='home/../collect\u view'(DataCollection的父目录)的情况下运行的???
from redis import Redis
import rq
from collect_data import transfer

redis_url = Redis.from_url('redis://')  #(config['REDIS_URL'])
queue = rq.Queue('rq_worker-data2db', connection=redis_url)

#.....
#.....

def have_data(data):

    rq_job = queue.enqueue('collect_data.transfer', data)

#.....
#.....
from base import Session, engine, Base
from tables import FieldData
import time
from datetime import datetime

def transfer(info):
    timestamp_in = datetime.utcnow()
    session = Session()
    data1 = FieldData(data=info, timestamp=timestamp_in)
    session.add(data1)
    session.commit()
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
base_url = '/home/.../collect_view/'
engine = create_engine ('sqlite:///' + base_url + 'app.db')
Session = sessionmaker(bind=engine)
Base = declarative_base()
from sqlalchemy import  Column, String, Float, Integer, Date, DateTime, Table, ForeignKey
from base import Base
from datetime import datetime
# .....
#.....
class FieldData(Base):
    __tablename__ = 'field_data'
    id = Column(Integer, primary_key=True)
    data = Column(String(20))
    timestamp = Column(DateTime, index=True, default=datetime.utcnow)

    def __init__(self, data, timestamp):
        self.data = data
        self.timestamp = timestamp