将参数传递给threading.Thread [英] Passing arguments to threading.Thread

查看:41
本文介绍了将参数传递给threading.Thread的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在Windows上使用的是Python3。我使用threading.Thread动态运行函数,我可以带参数或不带参数调用它。我正在设置一个物件列表,其中第一项是定义路径的字符串。其他论点将在列表中稍后出现。因此,args可能等于['C:SomePath'],也可能等于['C:SomePath', 'First Argument', 'Second Argument']。我的呼叫如下所示:

my_script = threading.Thread(target=scr_runner, args=q_data.data)
my_script.start()

问题在于,在调用threading.Thread和/或start函数的过程中,参数正在失去其列表特征(isinstance(q_data.data, str)=False),但在接受script_to_run_data参数isinstance(script_to_run_data, str)=True.

scr_runner函数内部

我需要此参数从头到尾保持为一个列表。我如何才能做到这一点?

我在文档中看到threading.Thread函数需要一个元组。将类似['C:SomePath']的内容转换为元组(在元组中将其转换为字符串)是否有问题?

提前感谢您抽出时间!

以下是MWE:

# coding=utf-8
""" This code tests conversion to list in dynamic calling. """

import threading


def scr_runner(script_to_run_data: tuple) -> None:
    """ This is the function to call dynamically. """
    is_list = not isinstance(script_to_run_data, str)
    print("scr_runner arguments are a list: T/F. " + str(is_list))


my_list=['C:SomePath']
is_list = not isinstance(my_list, str)
print("About to run script with list argument: T/F. " + str(is_list))
my_script = threading.Thread(target=scr_runner, args=my_list)
my_script.start()

现在,奇怪的是,当我使my_list包含更多元素时出现错误:

# coding=utf-8
""" This code tests conversion to list in dynamic calling. """

import threading


def scr_runner(script_to_run_data: tuple) -> None:
    """ This is the function to call dynamically. """
    is_list = not isinstance(script_to_run_data, str)
    print("scr_runner arguments are a list: T/F. " + str(is_list))


my_list=['C:SomePath', 'First Argument', 'Second Argument']
is_list = not isinstance(my_list, str)
print("About to run script with list argument: T/F. " + str(is_list))
my_script = threading.Thread(target=scr_runner, args=my_list)
my_script.start()

产生错误:

About to run script with list argument: T/F. True
Exception in thread Thread-1:
Traceback (most recent call last):
  File "C:ProgramDataAnaconda3lib	hreading.py", line 916, in  
       _bootstrap_inner
    self.run()
  File "C:ProgramDataAnaconda3lib	hreading.py", line 864, in run
    self._target(*self._args, **self._kwargs)
TypeError: scr_runner() takes 1 positional argument but 3 were given

推荐答案

args是要传递的参数序列;如果您想要传入一个list作为唯一的位置参数,则需要传递args=(my_list,),使其成为包含list(或者基本上等价于args=[my_list])的一元组。

它需要是一个参数序列,即使只传递了一个参数,这恰恰是为了避免您造成的歧义。如果scr_runner有三个参数,其中两个使用默认值,my_list的长度为3,那么您的意思是将这三个元素作为三个参数传递,还是应该将my_list作为第一个参数,而其他两个仍然是默认值?

这篇关于将参数传递给threading.Thread的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆