python 中的多处理出现错误“需要 1 个位置参数,但给出了 2 个”

问题描述 投票:0回答:2

我是 python 和 django 的初学者,并尝试使用多处理运行外部代码。

在我第一次尝试使用 numpy 导入 .txt 时,我的代码运行了。 在我第二次尝试使用 pandas 导入 .csv 时,我收到一条错误消息。 有什么不同?为什么不进行第二次尝试?

quick.py

import os
import pandas as pd
import numpy as np

def import_txt(q, w_url):
    w_data = np.loadtxt(w_url,delimiter=';', dtype='str')
    q.put(w_data)

def import_csv(q, w_url):
    w_data = pd.read_csv(w_url)
    w_data.head()
    q.put(True)

views.py

from multiprocessing import Process, Queue, set_start_method
from app.static.code.quick import import_txt as q_txt
from app.static.code.quick import import_csv as q_csv

这个有效

def q_history(request):

    if request.method == 'POST' and request.is_ajax():

        #erstellt den pfad
        m_user = request.user.username
        m_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
        m_dir = os.path.join(m_dir, 'app', 'media', m_user, 'quick', 'ini.txt')

        set_start_method('spawn', True)
        q = Queue()
        p = Process(target=q_txt, args=(q,m_dir))
        p.start()
        m_data = q.get()
        p.join()      

        return JsonResponse(m_data.tolist(), safe=False)

    else :
        assert isinstance(request, HttpRequest)
        return render(
        request,
        'quick.html',
        {
            'title':'title',
            'message':'Your application description page.',
            'year':datetime.now().year,
        }
    )

这不是

def q_csv(request):

    if request.method == 'POST' and request.is_ajax():

        #erstellt den pfad
        m_user = request.user.username
        m_file = '2019_Test.csv'
        m_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
        m_dir = os.path.join(m_dir, 'app', 'media', m_user, 'quick', 'input', m_file)

        set_start_method('spawn', True)
        q = Queue()
        p = Process(target=q_csv, args=(q,m_dir))
        p.start()
        m_data = q.get()
        p.join()      

        return JsonResponse(m_data.tolist(), safe=False)

    else :
        assert isinstance(request, HttpRequest)
        return render(
        request,
        'quick.html',
        {
            'title':'title',
            'message':'Your application description page.',
            'year':datetime.now().year,
        }
    )

错误

Process Process-1:
Traceback (most recent call last):
  File "/usr/local/Cellar/python/3.7.4/Frameworks/Python.framework/Versions/3.7/lib/python3.7/multiprocessing/process.py", line 297, in _bootstrap
    self.run()
  File "/usr/local/Cellar/python/3.7.4/Frameworks/Python.framework/Versions/3.7/lib/python3.7/multiprocessing/process.py", line 99, in run
    self._target(*self._args, **self._kwargs)
TypeError: q_csv() takes 1 positional argument but 2 were given
python django process multiprocessing queue
2个回答
3
投票

用这行:

p = Process(target=q_csv, args=(q,m_dir))

你正在调用这个方法

def q_csv(request):

有 2 个参数(

q
m_dir
),但只需要 1 个(
request
),我想你可能只是想以不同的方式命名你的函数 q_csv 因为我猜你想要导入的那个。所以换线

def q_csv(request):

def q_csv_processing(request):

看看它是否能让你实现你想要实现的目标。


0
投票

如果当函数采用单个参数并且您传递单个参数时遇到此问题,则可能存在语法问题。

假设您有以下功能

def task(param: str):
  # do something

如果你要定义

p = multiprocessing.Process(target=task, args=("ab"))

这会告诉你

TypeError: task() takes 1 positional argument but 2 were given

这是什么问题??

嗯,构造函数参数

args
必须是
tuple
。当括号内有单个元素时,Python 会将括号视为语法糖并忽略它们!

你传递一个字符串,它也是可迭代的。它说传递了两个参数,因为这是字符串中的字符数

ab

type(("ab")) # prints str
type(("ab",)) # prints tuple

所以只需添加一个逗号来明确表示您要构造一个元组!

p = multiprocessing.Process(target=task, args=("ab",))
© www.soinside.com 2019 - 2024. All rights reserved.