【问题标题】:How can I run this shell script inside python?如何在 python 中运行这个 shell 脚本?
【发布时间】:2018-01-23 15:24:52
【问题描述】:

我想从 python 程序运行 bash 脚本。该脚本有这样的命令:

find . -type d -exec bash -c 'cd "$0" && gunzip -c *.gz | cut -f 3 >> ../mydoc.txt' {} \;

通常我会运行如下子进程调用:

subprocess.call('ls | wc -l', shell=True)

但这在此处是不可能的,因为引用符号。有什么建议吗?

谢谢!

【问题讨论】:

标签: python bash shell subprocess popen


【解决方案1】:

虽然问题已经得到解答,但我仍然会加入,因为我假设您想要执行该 bash 脚本,因为您没有功能等效的 Python 代码(基本上少于 40 行,见下文)。 为什么这样做而不是 bash 脚本?

  • 您的脚本现在可以在任何具有 Python 解释器的操作系统上运行
  • 功能更易于阅读和理解
  • 如果您需要什么特别的东西,修改自己的代码总是更容易
  • 更多 Pythonic :-)

请记住,它(作为您的 bash 脚本)没有任何类型的错误检查,并且输出文件是一个全局变量,但可以轻松更改。

import gzip
import os

# create out output file
outfile = open('/tmp/output.txt', mode='w', encoding='utf-8')

def process_line(line):
    """
    get the third column (delimiter is tab char) and write to output file
    """
    columns = line.split('\t')
    if len(columns) > 3:
        outfile.write(columns[3] + '\n')

def process_zipfile(filename):
    """
    read zip file content (we assume text) and split into lines for processing
    """
    print('Reading {0} ...'.format(filename))
    with gzip.open(filename, mode='rb') as f:
        lines = f.read().decode('utf-8').split('\n')
        for line in lines:
            process_line(line.strip())


def process_directory(dirtuple):
    """
    loop thru the list of files in that directory and process any .gz file
    """
    print('Processing {0} ...'.format(dirtuple[0]))
    for filename in dirtuple[2]:
        if filename.endswith('.gz'):
            process_zipfile(os.path.join(dirtuple[0], filename))

# walk the directory tree from current directory downward
for dirtuple in os.walk('.'):
    process_directory(dirtuple)

outfile.close()

【讨论】:

    【解决方案2】:

    三引号或三双引号('''some string''' or """some other string""")也很方便。请参阅here(是的,它的 python3 文档,但它在 python2 中都 100% 有效)

    mystring = """how many 'cakes' can you "deliver"?"""
    print(mystring)
    how many 'cakes' can you "deliver"?
    

    【讨论】:

      【解决方案3】:

      \ 转义' 标记。

      对于每个:',替换为:\'

      【讨论】:

        猜你喜欢
        • 2020-10-08
        • 1970-01-01
        • 2019-03-15
        • 2012-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-27
        相关资源
        最近更新 更多