)
我是 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
用这行:
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):
看看它是否能让你实现你想要实现的目标。
如果当函数采用单个参数并且您传递单个参数时遇到此问题,则可能存在语法问题。
假设您有以下功能
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",))