为什么eval无法在python中运行此行?

问题描述

起初,我收到以下代码的语法错误:

eval('A'+str(x)+' = np.flip(cv2.imread(r"'+str(path)+'\\'+str(image[x-firstImage])+'",cv2.IMREAD_UNCHANGED),1)')

我以为我可能搞砸了,所以我尝试从以下位置开始准系统(实际上只是读入一张图像):

import numpy as np
import cv2

x = 1

#Number of pixels in img
column = 500
row = 200

A1 = np.zeros((row,column)) 

path = r'C:\Users\Boyon\Desktop\PhotoFile'
image = 'photo01.tif'

eval('A'+str(x)+' = cv2.imread(r"'+str(path)+'\\'+str(image)+'",cv2.IMREAD_UNCHANGED)') 

但是我仍然遇到语法错误。代码正在读取的是

A1 = cv2.imread(r"C:\Users\Boyon\Desktop\PhotoFile\photo01.tif",cv2.IMREAD_UNCHANGED)

我知道这是行得通的,因为我是在几周前才完成的,所以我不知道这是否是eval的根本问题?我对它的了解不是很好,所以我不确定我输入的内容是否有效。 错误代码如下:

  File "<string>",line 1
    A1 = cv2.imread(r"C:\Users\Boyon\Desktop\PhotoFile\photo01.tif")
       ^
SyntaxError: invalid syntax

解决方法

您不能eval进行赋值,eval基本上仅用于评估赋值语句的 right 上通常可以找到的东西。

为此,您应该使用exec,前提是您了解并减轻了风险。例如,大致根据您的情况,请参见以下代码:

path = r'C:\Users\Boyon\Desktop\PhotoFile'
image = 'photo01.tif'

x = 1
exec('A'+str(x)+' = r"'+str(path)+'\\'+str(image)+'"')
print('EXEC',A1,'\n')

x = 2
A1 = eval(r"str(path)+'\\'+str(image)+str(x)")
print('EVAL1','\n')

x = 3
eval('A'+str(x)+' = r"'+str(path)+'\\'+str(image)+'"')
print('EVAL2','\n')

第一个呼叫exec将起作用,并设置全局A1。第二个也可以使用,因为您没有尝试分配。第三次失败:

EXEC C:\Users\Boyon\Desktop\PhotoFile\photo01.tif

EVAL1 C:\Users\Boyon\Desktop\PhotoFile\photo01.tif2

Traceback (most recent call last):
  File "testprog.py",line 13,in <module>
    eval('A'+str(x)+' = r"'+str(path)+'\\'+str(image)+'"')
  File "<string>",line 1
    A3 = r"C:\Users\Boyon\Desktop\PhotoFile\photo01.tif"
       ^
SyntaxError: invalid syntax

请记住,您不能使用exec在函数内设置 local 变量,有关详细信息,请参见here,但这基本上是由于{默认情况下传递给locals的{​​1}}字典是实际本地语言的副本(为高度优化的内部结构而构建的字典)。

但是,您可以将您的 own 字典传递给exec来当作本地人,然后使用它来获取已设置的变量-绝非简单方法(或任何方法),以将其回显到 actual 当地人。

以下代码显示了如何执行此操作:

exec

输出为:

path = '/tmp/PhotoFile'
image = 'photo01.tif'

# Construct dictionary to take "locals".

mydict = {}
for i in range(10):
    exec(f"a{i} = '{path}/photo{9-i:02d}'",globals(),mydict)

# Show how to get at them.

for key in mydict:
    print(f"My dictionary: variable '{key}' is '{mydict[key]}'")

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...