等价于Python中的set -o pipefail吗?

雷·托尔

我有几个Python脚本,每个脚本都大量使用排序,唯一,计数,gzip和gunzip以及唤醒。第一次浏览我使用过的代码subprocess.call(是的,我知道安全风险,这就是为什么我说这是第一遍)shell=True我有一些辅助功能:

def do(command):
    start = datetime.now()
    return_code = call(command, shell=True)
    print 'Completed in', str(datetime.now() - start), 'ms, return code =', return_code
    if return_code != 0:
        print 'Failure: aborting with return code %d' % return_code
        sys.exit(return_code)

脚本如以下代码片段中所示使用该帮助程序:

do('gunzip -c %s | %s | sort -u | %s > %s' % (input, parse, flatten, output))
do("gunzip -c %s | grep 'en$' | cut -f1,2,4 -d\|| %s > %s" % (input, parse, output))
do('cat %s | %s | gzip -c > %s' % (input, dedupe, output))
do("awk -F ' ' '{print $%d,$%d}' %s | sort -u | %s | gzip -c > %s" % params)
do('gunzip -c %s | %s | gzip -c > %s' % (input, parse, output))
do('gunzip -c %s | %s > %s' % (input, parse, collection))
do('%s < %s >> %s' % (parse, supplement, collection))
do('cat %s %s | sort -k 2 | %s | gzip -c > %s' % (source,other_source,match,output)

还有更多类似的东西,有些甚至更长的流水线。

我注意到的一个问题是,当管道中的某条命令失败时,整个命令在退出状态为0时仍将成功。

set -o pipefail

但我看不到如何在Python中完成。我想我可以对bash进行显式调用,但这似乎是错误的。是吗?

代替回答这个特定问题,我很想听听在不使用的情况下在纯Python中实现这种代码的替代方法shell=True但是,当我尝试使用时Popenstdout=PIPE代码大小变大了。关于在一行中将流水线作为字符串编写是有好处的,但是如果有人知道在Python中使用优雅的多行“正确且安全”的方法,我将很乐意听到!

顺便说一句:这些脚本中没有一个接受用户输入。他们在一台具有已知外壳的机器上运行批处理作业,这就是为什么我实际上冒犯邪恶shell=True只是为了看看情况如何。而且它们看起来确实很容易阅读,并且代码看起来非常简洁!shell=True如果早期组件发生故障,如何在原始Python中删除和运行这些较长的管道,同时又具有中止进程的优势?

阿尔夫

您可以pipefail在系统调用中设置

def do(command):
  start = datetime.now()
  return_code = call([ '/bin/bash', '-c', 'set -o pipefail; ' + command ])
  ...

或者,正如@RayToal在注释中指出的那样,使用-o外壳程序选项来设置此标志:call([ '/bin/bash', '-o', 'pipefail', '-c', command ])

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

等价于Python中的set -o pipefail吗?

来自分类Dev

Equivalent of set -o pipefail in Python?

来自分类Dev

Perl 中的 =~ 等价于 Python 中的 re.match 吗?

来自分类Dev

set -e -o pipefail由于make不兼容而无法正常工作

来自分类Dev

等价于Python的C#中的“ struct.pack / unpack”吗?

来自分类Dev

等价于R中的Python“ json.dumps()”吗?

来自分类Dev

脚本中的shebang“#!/ bin / bash -o pipefail”导致无效的选项名称错误

来自分类Dev

等价于wevtutil在Powershell中吗?

来自分类Dev

等价于Python / Pandas中的R / ifelse吗?比较字符串列?

来自分类Dev

等价于python的ord()和chr()吗?

来自分类Dev

等价于Ruby中的subprocess.Popen()吗?

来自分类Dev

如何在Makefile中设置pipefail

来自分类Dev

O(K + (NK)logK) 等价于 O(K + N log K) 吗?

来自分类Dev

等价于?在Java for Python中?

来自分类Dev

茱莉亚中的“ as”等价Python

来自分类Dev

python中的字符等价

来自分类Dev

python pdb等价于perldb方法可调用吗?

来自分类Dev

等价于Rust中的__func__或__FUNCTION__吗?

来自分类Dev

等价于MSBuild Runner中的sonar.visualstudio.skippedProjectPattern吗?

来自分类Dev

“ set -eo pipefail”在Linux的Windows子系统中不起作用(Ubuntu 16.04)

来自分类Dev

Swift等价于arrayWIthObjects吗?

来自分类Dev

这些步骤是等价的吗?

来自分类Dev

python bisect是O(n ^ 2)吗?

来自分类Dev

是在哈希表O(1)中查找吗?

来自分类Dev

Python等价于Matlab中的“保持”

来自分类Dev

等价于Python中R的source()

来自分类Dev

set -e和set -o errexit之间有区别吗?

来自分类Dev

bash中set -o选项的预期有效顺序是什么?“ histexpand”胜过“ posix”吗?

来自分类Dev

bash中set -o选项的预期有效顺序是什么?“ histexpand”胜过“ posix”吗?

Related 相关文章

  1. 1

    等价于Python中的set -o pipefail吗?

  2. 2

    Equivalent of set -o pipefail in Python?

  3. 3

    Perl 中的 =~ 等价于 Python 中的 re.match 吗?

  4. 4

    set -e -o pipefail由于make不兼容而无法正常工作

  5. 5

    等价于Python的C#中的“ struct.pack / unpack”吗?

  6. 6

    等价于R中的Python“ json.dumps()”吗?

  7. 7

    脚本中的shebang“#!/ bin / bash -o pipefail”导致无效的选项名称错误

  8. 8

    等价于wevtutil在Powershell中吗?

  9. 9

    等价于Python / Pandas中的R / ifelse吗?比较字符串列?

  10. 10

    等价于python的ord()和chr()吗?

  11. 11

    等价于Ruby中的subprocess.Popen()吗?

  12. 12

    如何在Makefile中设置pipefail

  13. 13

    O(K + (NK)logK) 等价于 O(K + N log K) 吗?

  14. 14

    等价于?在Java for Python中?

  15. 15

    茱莉亚中的“ as”等价Python

  16. 16

    python中的字符等价

  17. 17

    python pdb等价于perldb方法可调用吗?

  18. 18

    等价于Rust中的__func__或__FUNCTION__吗?

  19. 19

    等价于MSBuild Runner中的sonar.visualstudio.skippedProjectPattern吗?

  20. 20

    “ set -eo pipefail”在Linux的Windows子系统中不起作用(Ubuntu 16.04)

  21. 21

    Swift等价于arrayWIthObjects吗?

  22. 22

    这些步骤是等价的吗?

  23. 23

    python bisect是O(n ^ 2)吗?

  24. 24

    是在哈希表O(1)中查找吗?

  25. 25

    Python等价于Matlab中的“保持”

  26. 26

    等价于Python中R的source()

  27. 27

    set -e和set -o errexit之间有区别吗?

  28. 28

    bash中set -o选项的预期有效顺序是什么?“ histexpand”胜过“ posix”吗?

  29. 29

    bash中set -o选项的预期有效顺序是什么?“ histexpand”胜过“ posix”吗?

热门标签

归档