为什么 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:UsersBoyonDesktopPhotoFile'
image = 'photo01.tif'
eval('A'+str(x)+' = cv2.imread(r"'+str(path)+'\'+str(image)+'",cv2.IMREAD_UNCHANGED)') 

但我还是有语法错误。代码读取的是

A1 = cv2.imread(r"C:UsersBoyonDesktopPhotoFilephoto01.tif",cv2.IMREAD_UNCHANGED)

我知道它有效,因为我几周前刚刚做过,所以我不知道这是否是eval的根本问题?我对它的了解不多,所以我不确定我输入的内容是否不起作用。错误代码如下:

File "<string>", line 1
A1 = cv2.imread(r"C:UsersBoyonDesktopPhotoFilephoto01.tif")
^
SyntaxError: invalid syntax

不能使用eval赋值,eval基本上只是用于评估赋值语句的右侧上的内容。

如果您了解并减轻了风险,您可能应该使用exec。例如,请参阅以下代码,大致基于您的代码:

path = r'C:UsersBoyonDesktopPhotoFile'
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', A1, 'n')
x = 3
eval('A'+str(x)+' = r"'+str(path)+'\'+str(image)+'"')
print('EVAL2', A1, 'n')

第一个调用exec将工作,并设置全局A1。第二个也会起作用,因为你没有尝试分配任务。第三个将失败:

EXEC C:UsersBoyonDesktopPhotoFilephoto01.tif
EVAL1 C:UsersBoyonDesktopPhotoFilephoto01.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:UsersBoyonDesktopPhotoFilephoto01.tif"
^
SyntaxError: invalid syntax

请记住,您不能使用exec在函数内设置局部变量,请参阅此处了解详细信息,但这基本上是由于默认传递给execlocals字典是实际局部的副本(一个为高度优化的内部结构而构建的字典(。

然而,您可以将自己的字典传递给exec,将其视为局部变量,然后使用它来获取所设置的变量-没有简单的方法(或者任何方法(将其返回到实际的local。

以下代码显示了如何做到这一点:

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]}'")

输出为:

My dictionary: variable 'a0' is '/tmp/PhotoFile/photo09'
My dictionary: variable 'a1' is '/tmp/PhotoFile/photo08'
My dictionary: variable 'a2' is '/tmp/PhotoFile/photo07'
My dictionary: variable 'a3' is '/tmp/PhotoFile/photo06'
My dictionary: variable 'a4' is '/tmp/PhotoFile/photo05'
My dictionary: variable 'a5' is '/tmp/PhotoFile/photo04'
My dictionary: variable 'a6' is '/tmp/PhotoFile/photo03'
My dictionary: variable 'a7' is '/tmp/PhotoFile/photo02'
My dictionary: variable 'a8' is '/tmp/PhotoFile/photo01'
My dictionary: variable 'a9' is '/tmp/PhotoFile/photo00'

相关内容

  • 没有找到相关文章

最新更新