【问题标题】:(Python 3.X) Python exec() function throws TypeError for no reason(Python 3.X) Python exec() 函数无缘无故抛出 TypeError
【发布时间】:2019-02-19 20:56:36
【问题描述】:

我正在处理的项目遇到问题。我在代码中找到了这个问题发生的位置,并将其放在一个孤立的、简单的环境中,并且错误仍然存​​在。

代码如下:

def parse(input_var):
    input_var = input_var.split("[METHOD]")
    if(len(input_var)>1):
        input_var[0] = input_var[0].replace("using ","exec(parse(")
        input_var[0] = input_var[0].replace(";","))")
        input_var = input_var[0]+input_var[1]
    else:
        input_var=input_var[0]
    exec(input_var)


foo="""
using bar;
[METHOD]
print('Passed foo!')
"""

bar = """
print('Passed bar!')
"""

parse(foo)

这是运行代码的输出:

Passed bar!
Traceback (most recent call last):
  File "python", line 22, in <module>
  File "python", line 9, in parse
  File "<string>", line 2, in <module>
TypeError: exec() arg 1 must be a string, bytes or code object

“bar”段代码导致了问题,尽管它显然是一个字符串。最糟糕的是,它从不运行“foo”代码的后半部分,而在我使用此代码的其他程序中,这部分是必要的。

【问题讨论】:

  • 您是否尝试过对此进行简单调试,例如在 if 块内的每一行之后打印您的 input_var

标签: python python-3.x exec typeerror


【解决方案1】:

您遇到此错误是因为input_var 包含exec。因此,您尝试执行代码,而该代码又尝试执行另一个代码。而第二次exec 的参数不是字符串而是函数parse。所以从input_var 中删除exec 字。然后你没有错误并得到输出:

Passed bar!
Passed foo!

【讨论】:

    【解决方案2】:

    您必须从 "exec(parse(" 中删除调用 exec 它将正常工作,因为 exec 函数仅接受字符串、字节或代码对象作为 arg 无需在此代码语句中添加它

    def parse(input_var):
        input_var = input_var.split("[METHOD]")
        if(len(input_var)>1):
            input_var[0] = input_var[0].replace("using ","parse(")
            input_var[0] = input_var[0].replace(";",");")
            input_var = input_var[0]+input_var[1]
        else:
            input_var=input_var[0]
        exec(input_var)
    
    
    foo="""
    using bar;
    [METHOD]
    print('Passed foo!')
    """
    
    bar = """
    print('Passed bar!')
    """
    
    parse(foo)
    

    【讨论】:

    • 非常感谢!我完全忽略了这一点。
    猜你喜欢
    • 2022-08-16
    • 1970-01-01
    • 2019-04-14
    • 1970-01-01
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多