python - Django 从 celery 的 subprocess.Popen 获得干净的返回

标签 python django shell subprocess

我有一个调用 subprocess.Popen 又名 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

任务.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>

提前致谢

最佳答案

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

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

关于python - Django 从 celery 的 subprocess.Popen 获得干净的返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54611035/

相关文章:

python - 无法从本地服务器外部连接到 Django

perl - Bash/shell 错误运行 perl -e 'use [module]' : Can't find string terminator "' "anywhere before EOF at -e line 1

python - 将 AWS Glue Python 与 NumPy 和 Pandas Python 程序包结合使用

python - 在python中提取列表中的重复元素

python - Django 在数据库中搜索

python - 自定义验证器中的 XML ParseError : junk after document element: line 1, 第 11 列 (Wagtail)

linux - awk 向文本添加颜色代码

shell - 如何删除多个文件的尾随空格?

python - 克利福德图书馆 : Blade indexing causing key error

python - 根据 NetworkX 中的权重改变边缘的厚度