【问题标题】:Django get a clean return from subprocess.Popen at celeryDjango 从 celery 的 subprocess.Popen 获得干净的回报
【发布时间】:2019-07-03 19:04:46
【问题描述】:

我有一个调用 subprocess.Popen aka shell cmd 的 celery 任务,但由于某种原因,cmd 的输出没有保存到用户字段,而是进程内存 id !?!?

[2019-02-09 21:35:05,526: INFO/MainProcess] Received task: MyProject.tasks.allocate_new_btc_address[08d7db34-5710-4224-be07-c968599d9039]  
[2019-02-09 21:35:05,540: WARNING/ForkPoolWorker-9] <subprocess.Popen object at 0x7f31063d79b0>
[2019-02-09 21:35:05,540: INFO/ForkPoolWorker-9] MyProject.tasks.allocate_new_btc_address[08d7db34-5710-4224-be07-c968599d9039]: New BTC address has been allocated to a user account
[2019-02-09 21:35:05,540: INFO/ForkPoolWorker-9] Task MyProject.tasks.allocate_new_btc_address[08d7db34-5710-4224-be07-c968599d9039] succeeded in 0.012948354000400286s: None
iubcasiuiuBIUcb723iub7c8732iewe

tasks.py

@app.task
def allocate_new_btc_address(user_pk):
    user = User.objects.get(pk=user_pk)
    new_address = subprocess.Popen(['electrum', 'createnewaddress'])
    try:
        user.acc_btc_addr = new_address
        user.save()
        print(new_address)
        logger.info("New BTC address has been allocated to a user account")
    except Exception as e:
        print(e)

这就是保存到现场的价值:

<subprocess.Popen object at 0x7f31063d79b0>

提前致谢

【问题讨论】:

    标签: python django shell subprocess


    【解决方案1】:

    Popen 返回一个对象。要直接获取输出,请使用 subprocess.check_output() 函数:

    from subprocess import check_output
    new_address = check_output(['electrum', 'createnewaddress'])
    

    【讨论】:

    • 让它像这样工作:new_address = subprocess.Popen("electrum createnewaddress", shell=True,stdout=subprocess.PIPE).communicate()[0].decode('utf-8' ).strip()
    猜你喜欢
    • 2020-12-16
    • 2021-12-04
    • 2019-09-27
    • 2016-09-09
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-10
    相关资源
    最近更新 更多