【问题标题】:using bash command script in python在 python 中使用 bash 命令脚本
【发布时间】:2018-11-08 12:18:38
【问题描述】:

我有一个 python 脚本,它在运行时会在终端上记录信息,我想将此记录信息发送到文本文件,

为了在我插入的文件的开头实现这一点

import subprocess
subprocess.call(['script', 'logfile'])

在文件的最后,我输入了,

subprocess.call(['exit'])

问题是当它调用第一个命令script logfile时,它会终止脚本,

任何关于我如何完成这项工作的建议都会非常有帮助,在此先感谢

【问题讨论】:

  • 你试过直接运行你的script logfile吗?
  • 如果我使用命令行先运行script logfile,然后运行我的脚本,就可以了!但我希望它集成到我的主脚本中,如果我单独运行它,首先我必须在终端上运行script logfile,然后运行我的脚本,完成后运行exit
  • 它不会终止脚本;它正在运行一个 new shell,它的输入和输出都被记录下来。当您终止 那个 shell 时,您的 Python 脚本将恢复。

标签: python bash


【解决方案1】:

问题是subprocess.call 直到script 生成的shell 退出后才会返回,此时您的Python 脚本将恢复。

做你想做的最简单的方法是调用script 本身,并将你的 Python 脚本作为参数。而不是

#!/usr/bin/python

import subprocess

subprocess.call(['script', 'logfile'])

# Rest of your Python code

subprocess.call(['exit'])

你会使用

#!/usr/bin/python

import os
import sys

if '_underscript' not in os.environ:
    os.environ['_underscript'] = "yes"
    cmd_args = ['script', 'logfile', 'python'] + sys.argv
    os.execvp('script', cmd_args)

# Rest of your Python code

环境变量可防止您的脚本进入无限循环,使用script 重新运行自身。当您运行 Python 脚本时,它首先会检查其环境中不应该存在的变量。如果没有,它会设置该变量,然后运行 ​​script 以重新运行 Python 脚本。 execvp 将您的脚本替换为对 script 的调用; Python 脚本中没有其他任何内容执行。您的脚本第二次运行时,变量 _underscript 确实 存在,这意味着 if 块被跳过,脚本的其余部分按预期运行。

【讨论】:

  • 嗨,chepner,谢谢你的回复,我有一个疑问,我通过在文件顶部添加这个sn-p来调用我的脚本,我在终端上运行python3 server.py的文件,我一直得到与以前相同的行为,这意味着它不会运行我的脚本,如果我在这里遗漏了什么,请告诉我,谢谢
  • 你确定吗?使用您的代码,script 运行后出现的 shell 与您启动 Python 脚本的 shell 相同。
  • 实际上,我应该更明确一点:if '_underscript'替换您需要调用subprocess.call(['script'])。你在运行script 两次吗?
  • 真的,最简单的做法就是正常编写Python脚本,并让调用者有责任用script logfile python yourScript.py ...而不是python yourScript.py ...来运行它。
  • cmd_args = ['script', 'logfile', 'python'] + sys.argv 可以改进为 cmd_args = ['script', 'logfile', sys.executable] + sys.argv
【解决方案2】:

这似乎是subprocess.call(...) 的预期行为。如果要将脚本的输出捕获到文件中,则需要以写入模式打开一个新的文件处理程序,并告诉subprocess.callstdout 指向哪里,这是您通常会使用的终端输出见。

试试:

import subprocess
f = open('/tmp/mylogfile.log', 'w')
subprocess.call(['/path/to/script'], stdout=f)
f.close()

然后可以在终端运行tail /tmp/mylogfile.log进行确认。

我不确定您要实现的目标是否需要最后一次 exit 调用。

您可以在 python 文档中阅读更多内容,具体取决于您使用的 Python 版本。 https://docs.python.org/2/library/subprocess.html

该文件不需要预先存在。希望对您有所帮助!

【讨论】:

  • 让我试试这个
  • 它只记录输出,不记录输入
  • @Jean-FrançoisFabre 是的,这是正确的,如果您可以在 subprocess.call 中看到其中一个论据,我们将告诉 stdout(在终端中,这是您的标准输出,即文本您在执行命令后会看到)写入变量f,即该文件。如果您也想要输入,理论上可以添加另一个参数stdin=f(其中stdin 表示标准输入)。正如我所说,您可以阅读文档以确切了解如何执行此操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-19
  • 2014-10-04
  • 2021-07-20
  • 2013-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多