我已将bash命令集成到我的Python代码中-如何获得此命令以从Shell中获取输入?

时间:2019-08-12 09:04:08

标签: python linux bash

我已经在我的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

2 个答案:

答案 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)