将参数传递给threading.Thread

问题描述 投票:1回答:1

我在Windows上使用Python 3。我正在使用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),但在scr_runner函数内部,它采用script_to_run_data参数,isinstance(script_to_run_data, str)=True.

我需要这个论点来保持整个列表。我怎样才能做到这一点?

我在文档中读到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:\ProgramData\Anaconda3\lib\threading.py", line 916, in  
       _bootstrap_inner
    self.run()
  File "C:\ProgramData\Anaconda3\lib\threading.py", line 864, in run
    self._target(*self._args, **self._kwargs)
TypeError: scr_runner() takes 1 positional argument but 3 were given
multithreading python-3.x arguments parameter-passing
1个回答
2
投票

args是一系列通过的论据;如果你想传入一个list作为唯一的位置参数,你需要传递args=(my_list,)使其成为包含list的一元组(或者大多数等同于args=[my_list])。

它必须是一个参数序列,即使只传递一个参数,也可以准确地避免您创建的歧义。如果scr_runner有三个参数,两个有默认值,my_list长度为3,你的意思是将三个元素作为三个参数传递,还是my_list应该是第一个参数,另外两个仍然是默认值?

© www.soinside.com 2019 - 2024. All rights reserved.