我试图从这个repo运行代码:https://github.com/tylin/coco-caption,特别是来自https://github.com/tylin/coco-caption/blob/master/pycocoevalcap/tokenizer/ptbtokenizer.py,第51-52行:
p_tokenizer = subprocess.Popen(cmd, cwd=path_to_jar_dirname, \
stdout=subprocess.PIPE)
我运行这个错误是
^{pr2}$我不明白为什么找不到档案。在
我试着运行的罐子是:
stanford-corenlp-3.4.1.jar
您可以通过转到https://github.com/tylin/coco-caption/tree/master/pycocoevalcap/tokenizer查看目录的结构。对于运行代码行时实际参数的详细信息:
cmd= ['java', '-cp', 'stanford-corenlp-3.4.1.jar', 'edu.stanford.nlp.process.PTBTokenizer', '-preserveLines', '-lowerCase', 'tmpWS5p0Z'],
以及
path_to_dirname =abs_path_to_folder/tokenizer
我可以看到需要运行的jar,它看起来在正确的位置,那么python为什么找不到它呢。(注意:我使用的是python2.7。)临时文件“tmpWS5p0Z”就是它应该位于的位置。在
编辑:我在用Ubuntu
以防万一可能会对某人有所帮助:
我正为同样的问题而挣扎(同样的https://github.com/tylin/coco-caption代码)。可能与我在CentOS上使用
qsub
运行Python3.7的代码有关。所以我改变了到
^{pr2}$使用绝对路径修复了
OSError: [Errno 2] No such file or directory
。请注意,我仍然将'/abs/path/to/temporary_file'
作为cmd
列表中的第二个元素,因为它是在稍后添加的。但后来,记号发生器java子进程出了问题,我不知道原因或原因,只是观察一下,因为:这里
token_lines
是一个空列表(这不是想要的行为)。{{cd7>这不仅仅导致了再说一遍,我不知道为什么或是什么,但我只想和大家分享这样做可以修复它:
并将}。在
cmd.append(os.path.join(path_to_jar_dirname, os.path.basename(tmp_file.name)))
改为{因此,将
cmd
放入一个只有1个元素的列表中,同时包含具有绝对路径的整个命令。谢谢你的帮助!在尝试一个绝对路径(即从根
/
开始的路径)https://en.wikipedia.org/wiki/Path_(computing)#Absolute_and_relative_paths
有关python中的相对路径,请参见Relative paths in Python,How to refer to relative paths of resources when working with a code repository in Python
更新:
作为测试,请尝试使用
shell=True
选项subprocess.Popen()
,并为任何相关文件提供一个绝对路径,包括tmpWS5p0Z
在这个
subprocess.Popen()
调用涉及两条路径:1)python路径,python必须找到
java
可执行文件和stanford-corenlp-3.4.1.jar
,这实际上是一个具有自己路径的java程序2)
stanford-corenlp-3.4.1.jar
的java路径因为这太复杂了,试试看
p_tokenizer = subprocess.Popen(['/absolute_path_to/java -cp /absolute_path_to/stanford-corenlp-3.4.1.jar /absolute_path_to/edu.stanford.nlp.process.PTBTokenizer -preserveLines -lowerCase /absolute_path_to/tmpWS5p0Z' ], shell=True)
Python specify popen working directory via argument
Python subprocess.Popen() error (No such file or directory)
相关问题 更多 >
编程相关推荐