Итак, у меня есть скрипт на Python, который будет производить выборку с поверхностей трехмерного объекта, чтобы получить представление объекта в облаке точек.
У меня около 85 000 файлов данных, и некоторые из них на самом деле являются двумерными объектами и приведут к тому, что функция, выполняющая преобразование, будет работать вечно. Я планирую следовать этому подходу , использовать функцию signal.alarm()
и try except
, чтобы пропустить дела, которые выполняются слишком долго (более 5 секунд).
Однако следующий код не работает. Функция все еще застревает на проблемных файлах ...
Если у вас есть минутка, не могли бы вы помочь определить возможные причины? Я неправильно использую функцию signal.alarm()
? Спасибо!
Я на машине с Linux Ubuntu 16.04
Проблемный код произошел в блоке try except
в функции main
, которая является вызовом функции P = tri2pts(V, G, 2048)
. Копирование оставшегося кода только для согласованности.
import numpy as np
import pyximport; pyximport.install(inplace=True, reload_support=True)
from _trimesh2pointcloud import cy_trimesh2pointcloud as tri2pts
import signal
def handler(signum, frame):
print("Forever is over!")
raise Exception("end of time")
def strip_slash(str1):
slash_pos = str1.find('/')
if slash_pos > -1:
return int(str1[0:slash_pos])
else:
return int(str1)
def read_obj(fname):
with open(fname) as f:
content = f.readlines()
content = [x.strip('\n') for x in content]
content = [x.split() for x in content]
type_col = np.array([row[0] for row in content])
v_ind = np.where(type_col == 'v')[0]
f_ind = np.where(type_col == 'f')[0]
content = [x[1:4] for x in content]
content = np.array(content)
vertices = content[v_ind].tolist()
faces = content[f_ind].tolist()
vertices = np.array([[float(y) for y in x] for x in vertices])
faces = np.array([[strip_slash(y) - 1 for y in x] for x in faces])
return vertices, faces
def main():
base_dir = '/media/yuqiong/DATA/problems'
flist = os.listdir(base_dir)
for f in flist:
V, G = read_obj(os.path.join(base_dir, f))
print("Now process file ")
print(f)
signal.signal(signal.SIGALRM, handler)
signal.alarm(5)
try:
P = tri2pts(V, G, 2048)
except Exception as exc:
print(exc)
continue
if __name__ == '__main__':
main()