我正在尝试运行从github下载的一些开源代码: https://github.com/augustoqm/MCLRE
代码从我的Mac Shell运行。当到达subprocess.Popen()函数时,它会引发“ OSError:[Errno 8] Exec格式错误”。
代码:
mrbpr_cmd_args ='%s -m%s -d%s -u%s -n%s -o%s -k%d -s%d -h%d -l%f -f%d -i %d -a%s -e“%s” -r“%s” -M%s'\ %(mrbpr_bin_path,meta_file,train_files,test_users_file,test_candidates_file,output_dir,rank_size,\ save_model,算法,learn_rate,num_fact,num_iter,relationshipweights,regularization_per_entity,\ regularization_per_entity,型号名称)
proc = subprocess.Popen(shlex.split(mrbpr_cmd_args),shell = True)
当我打印“ mrbpr_cmd_args”变量时,结果为:
/Users/nastia/Desktop/MCLRE-master/src/recommender_execution/mrbpr/mrbpr.bin -m /Users/nastia/Desktop/MCLRE-master/data/experiments/recsys-15/bpr-net_meetup.meta- d /Users/nastia/Desktop/MCLRE-master/data/partitioned_data/san_jose/partition_12/mrbpr/user-event-rsvp_train.tsv,/Users/nastia/Desktop/MCLRE-master/data/partitioned_data/san_jose/partition_12/mrbpr /user-user-same-group_train.tsv,/Users/nastia/Desktop/MCLRE-master/data/partitioned_data/san_jose/partition_12/mrbpr/user-user-same-event_train.tsv -u / Users / nastia / Desktop / MCLRE-master / data / partitioned_data / san_jose / partition_12 / mrbpr / users_test.tsv -n /Users/nastia/Desktop/MCLRE-master/data/partitioned_data/san_jose/partition_12/mrbpr/event-candidates_test.tsv -o / Users / nastia /桌面/ MCLRE-master / data / experiments / recsys-15 / san_jose / recommendations / partition_12 / mrbpr -k 100 -s 0 -h 0 -l 0.100000 -f 200 -i 600 -a 0.25,0.15,0.6 -e “” -r“” -M BPR-NET_200-0.1-600-0.25:0.15:0.6
有人可以告诉我这个参数有什么问题吗?
答案 0 :(得分:3)
从GitHub存储库上的自述文件中链接至您:
要求
- Linux:所有实验都是在基于Linux的机器(Ubuntu发行版)上执行的,
而且,如果您查看that path inside the repo,则mrbpr.bin
是Linux可执行二进制文件。您不能在Mac上运行它。
如果他们提供了自行构建该可执行文件的源代码,或者提供了找到该可执行文件的链接,则可能可以构建Mac版本。但是,如果不这样做,您将无法修复它。
最好的选择可能是运行Linux容器,虚拟机或用户模式安装(在Mac上,或在一些免费的云主机上),在其中安装Python和所有其他要求,然后运行这样的代码。
如果您想知道为什么会遇到该特定错误:
OSError: [Errno 8] Exec format error
有多种不同的可执行文件格式:a.out,ELF,mach-O,COFF等。大多数linux可执行文件都是ELF格式。 macOS的加载器仅知道mach-O和a.out。因此,您的操作系统甚至无法弄清文件是什么,只能知道它不是知道如何处理的文件。但是,即使您过去了,Linux和Darwin的系统调用是不同的,glibc和BSD libc是不同的,依此类推,所以无论如何它都将迅速进行段错误。