Python调用TreeTagger时输入文件路径查找异常问题咨询
Python调用TreeTagger时文件找不到的问题解决思路
你遇到的问题核心在于subprocess.run创建的每个进程都是完全独立的:第一个cd命令只是在它自己的临时shell进程里切换了目录,等这个进程结束后,后续调用TreeTagger的进程还是在Python脚本的当前工作目录下执行,自然找不到TreeTagger文件夹里的输入文件。
具体原因拆解
- 你用
shutil.move把文件成功移到了path_treetagger目录下 - 第一个
subprocess.run('cd ' + path_treetagger, shell=True)仅在单独的shell进程内切换目录,这个进程结束后,Python的工作目录完全没变化 - 执行TreeTagger命令时,脚本会在Python当前工作目录(而非TreeTagger目录)查找输入文件,因此触发"找不到文件"的错误
- 另外你的语言判断逻辑还有个小bug:如果传入
language="sw",第一个if会把tt_lang设为tag-swahili,但第二个if-else会因为language!="en",又把tt_lang改回tag-english,导致永远用英语模型
三种可行解决方案
方案1:给subprocess指定cwd参数(最推荐)
直接让TreeTagger命令在目标目录下执行,无需单独执行cd:
import subprocess import shutil def call_treetagger(path_file, path_treetagger, language): # 移动文件到TreeTagger目录 source = path_file input_filename = 'swahili_one_word_per_line_tt.txt' destination = f"{path_treetagger}/{input_filename}" shutil.move(source, destination) # 修正语言判断逻辑 if language == "sw": tt_lang = 'tag-swahili' else: tt_lang = 'tag-english' # 构建命令,通过cwd指定工作目录 cmd_tt = f"{tt_lang} {input_filename} call_via_python_results.txt" subprocess.run(cmd_tt, shell=True, cwd=path_treetagger) call_treetagger("C:/Users/rosas/swahili_one_word_per_line.txt", "C:/TreeTagger", "sw")
方案2:合并cd和tag命令到同一进程
用&&把两个命令连起来,让它们在同一个shell进程里执行:
import subprocess import shutil def call_treetagger(path_file, path_treetagger, language): source = path_file input_filename = 'swahili_one_word_per_line_tt.txt' destination = f"{path_treetagger}/{input_filename}" shutil.move(source, destination) if language == "sw": tt_lang = 'tag-swahili' else: tt_lang = 'tag-english' # 合并命令:先切换目录再执行标注 cmd_tt = f"cd {path_treetagger} && {tt_lang} {input_filename} call_via_python_results.txt" subprocess.run(cmd_tt, shell=True) call_treetagger("C:/Users/rosas/swahili_one_word_per_line.txt", "C:/TreeTagger", "sw")
方案3:使用绝对路径指定文件
不需要切换目录,直接在命令里用文件的完整绝对路径:
import subprocess import shutil def call_treetagger(path_file, path_treetagger, language): source = path_file input_file = f"{path_treetagger}/swahili_one_word_per_line_tt.txt" output_file = f"{path_treetagger}/call_via_python_results.txt" shutil.move(source, input_file) if language == "sw": tt_lang = 'tag-swahili' else: tt_lang = 'tag-english' # 用绝对路径指定输入输出文件 cmd_tt = f"{tt_lang} {input_file} {output_file}" subprocess.run(cmd_tt, shell=True) call_treetagger("C:/Users/rosas/swahili_one_word_per_line.txt", "C:/TreeTagger", "sw")
内容的提问来源于stack exchange,提问作者Rosa
相关产品推荐
相关产品推荐

