【发布时间】:2019-11-28 22:50:52
【问题描述】:
我正在尝试从我的 Python 代码运行一个 bash 脚本。我在这样的子进程中调用脚本:
preprocessed = subprocess.check_output([
'bash',
'../Paraphrase_Demo/models/processing_utils/preprocess_data_givenBPE.sh',
phrase, src_lang, tgt_lang, this_dir
])
这里是脚本 preprocess_data_givenBPE.sh:
#!/usr/bin/env bash
REMOTE_PATH=$4/processing_utils
SCRIPTS=$REMOTE_PATH/tiny-moses
TOKENIZER=$SCRIPTS/tokenizer.perl
DETOKENIZER=$SCRIPTS/detokenizer_v2.perl
CLEAN=$SCRIPTS/clean-corpus-n.perl
NORM_PUNC=$SCRIPTS/normalize-punctuation.perl
REM_NON_PRINT_CHAR=$SCRIPTS/remove-non-printing-char.perl
BPEROOT=$4/zhen/tools/subword-nmt/subword_nmt
text=$1
flan=$2
BPE=$4/$2$3/data/bpecodes
echo $text | perl $NORM_PUNC -l $flan | perl $REM_NON_PRINT_CHAR |
perl $TOKENIZER -a -l $flan -q | python3 $BPEROOT/apply_bpe.py -c $BPE | cat
当我运行我的 Python 程序时,我得到以下输出:
Can't open perl script "C:/Users/Administrator/source/repos/Paraphrasing/Paraphrase_Demo/models/processing_utils/tiny-moses/normalize-punctuation.perl": No such file or directory
Can't open perl script "C:/Users/Administrator/source/repos/Paraphrasing/Paraphrase_Demo/models/processing_utils/tiny-moses/remove-non-printing-char.perl": No such file or directory
Can't open perl script "C:/Users/Administrator/source/repos/Paraphrasing/Paraphrase_Demo/models/processing_utils/tiny-moses/tokenizer.perl": No such file or directory
python3: can't open file 'C:/Users/Administrator/source/repos/Paraphrasing/Paraphrase_Demo/models/zhen/tools/subword-nmt/subword_nmt/apply_bpe.py': [Errno 2] No such file or directory
我已将这些路径中的每一个复制并粘贴到 powershell 和 ls'd 以验证它们是否正确,但它仍然说找不到它们。这里发生了什么?如果我直接运行 bash 脚本也会发生这种情况。
编辑:我尝试在路径中使用反斜杠并收到相同的错误。我还发现了这篇文章:Bash: cannot execute a perl script using an absolute path?,所以我尝试使用我的 Bash 脚本目录中的相对路径,但它仍然显示“没有这样的文件或目录。”
【问题讨论】:
-
要直接运行脚本,您必须在文件扩展名和解释脚本的程序之间建立关联。
-
@MarkRansom,它直接运行
python3 $BPEROOT/apply_bpe.py。显示的错误来自 Python,所以我们知道至少有这么多是有效的。 -
OP 说“C:/Users/Administrator/source/repos/Paraphrasing/Paraphrase_Demo/models/zhen/tools/subword-nmt/subword_nmt/apply_bpe.py”存在,但
ERROR_FILE_NOT_FOUND(2) 错误另有说明。 “apply_bpe.py”不是保留名称(DOS 设备或尾随空格或点),所以我认为路径有问题。如果这是真实路径,则不是MAX_PATH(260) 长度限制问题,也不是驱动器映射问题,因为它位于系统驱动器上。 -
@eryksun 谢谢,我错过了有关错误消息的详细信息。此时我唯一能想到的就是在文件名中使用`\`而不是`/`。
-
@MarkRansom : 也许你可以考虑使用 os.path.join。
标签: python windows shell subprocess