You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python调用TreeTagger时输入文件路径查找异常问题咨询

Python调用TreeTagger时文件找不到的问题解决思路

你遇到的问题核心在于subprocess.run创建的每个进程都是完全独立的:第一个cd命令只是在它自己的临时shell进程里切换了目录,等这个进程结束后,后续调用TreeTagger的进程还是在Python脚本的当前工作目录下执行,自然找不到TreeTagger文件夹里的输入文件。

具体原因拆解

  1. 你用shutil.move把文件成功移到了path_treetagger目录下
  2. 第一个subprocess.run('cd ' + path_treetagger, shell=True)仅在单独的shell进程内切换目录,这个进程结束后,Python的工作目录完全没变化
  3. 执行TreeTagger命令时,脚本会在Python当前工作目录(而非TreeTagger目录)查找输入文件,因此触发"找不到文件"的错误
  4. 另外你的语言判断逻辑还有个小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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 11:13:12