我已经在我的Python脚本中添加了一个bash命令-该bash命令用于线性化输入文件(即,将包含多行的文件合并为一行)。当我手动为命令写入文件名时(在本示例中,输入文件称为input.txt),它会起作用:
import subprocess
holder = subprocess.Popen('perl -ne "chomp;print;" input.txt', shell=True, stdout=subprocess.PIPE).stdout.read()
print(holder)
但是,我希望这个bash命令采用用户在命令行中指定的文件名并将其线性化。
我已经尝试使用%s
实现这一目标:
import subprocess
import sys
import os
path = sys.argv[1]
file = open(path, 'r')
inp = file.read()
holder = subprocess.Popen('perl -ne "chomp;print;" %s' % inp, shell=True, stdout=subprocess.PIPE).stdout.read()
print(holder)
但是,当我尝试此操作时,shell冻结并且不显示任何输出,并且bash $
提示符也不显示,没有错误消息。
在这种情况下,我想知道是否存在添加用户输入的有效方法,希望能对您有所帮助。
编辑:只是为了澄清,这是我在shell中键入的内容,以第二个示例来运行程序:
$ python3 program.py input.txt
答案 0 :(得分:2)
为什么不像这样直接将输入路径馈送到子流程?但是我对为什么要在python中使用perl这样做感到有些困惑。
import subprocess
import sys
import os
path = sys.argv[1]
holder = subprocess.Popen('perl -ne "chomp;print;" %s' % path, shell=True, stdout=subprocess.PIPE).stdout.read()
print(holder)
使用此示例输入:
test.txt
i
i
i
i
i
程序将输出:
python linearize.py test.txt
b'iiiii'
答案 1 :(得分:2)
import subprocess
import sys
import os
holder = subprocess.Popen('perl -ne "chomp;print;" {}'.format(sys.argv[1]), shell=True, stdout=subprocess.PIPE).stdout.read()
print(holder)
但是为什么呢?为什么要使用python调用perl脚本? Python具有在同一进程中使用本机,可调试和跨平台代码进行相同操作所需的所有工具。这没有道理,这是一个不好的做法。
import sys
with open(sys.argv[1]) as input_file:
holder = ''.join(input_file.read().splitlines())
print(holder)