【问题标题】:Forcing an enter on a program fired off in Python by os.system强制输入由 os.system 在 Python 中触发的程序
【发布时间】:2015-02-03 15:00:42
【问题描述】:

我正在使用从 python 执行程序的肮脏方式。该程序在完成之前需要用户输入。如何强制输入。问题当然是在第一个命令完全执行之前我不能发出任何进一步的命令,所以这不起作用:

os.system(command)
os.linesep('\r\n')

我重新使用 os.system(command) 的原因之一是我无法以正确的格式获取命令行参数。一个问题是command setting="xyz.txt" 的要求,双引号正确显示,我还没有找到一种聪明的方法来做到这一点。

有没有办法解决这个问题?我在 Windows 7 上执行此操作。我担心我需要检查输出并在看到程序结束时中断。有没有办法检测到程序正在接受键盘输入并使用这个事实?

【问题讨论】:

  • 你能提供更多的背景信息吗?什么操作系统?你在执行什么命令?
  • 它是一个自定义程序,需要在一个庞大的循环中运行数千次。它的 Windows 7。
  • 检查subprocess模块和communicate方法。
  • Popen(['echo', 'command setting="xyz.txt"']) 没看到问题,好像和第一个问题无关。如果它是如此依赖于 Windows 并且它确实不起作用,请开始一个新问题并更加明确(并使用适当的标签)。

标签: python


【解决方案1】:

查看subprocess 模块,尤其是subprocess.Popen()。一旦你的子进程运行起来,你就可以communicate 使用它,以及other 有用的功能。

【讨论】:

  • 是的,这就是我发现的。我现在正在考虑这样做!
  • 我回到使用 os.system(command) 的原因之一是我无法以正确的格式获取命令行参数。一个问题是命令 setting="xyz.txt" 的要求,双引号正确显示,我还没有找到一种聪明的方法来做到这一点。
  • @Navonod 对于出现的新问题不断编辑您的问题通常被认为不是一种好的形式,因为我们没有收到这些更改的通知,而且之前给出的答案现在看起来不适用。请回复您原来的问题,然后询问新的问题并提供新的详细信息。请包括您正在使用的实际代码、您获得的输出、您想要获得的输出以及您收到的任何错误或回溯的全文。
  • 创建对象时还需要stdin=subprocess.PIPE,然后obj.stdin.write("\n")或类似的发送换行符
【解决方案2】:

如果您希望脚本在某个时候模拟用户的击键,那么您可以按照此处的解决方案进行操作: Simulating a key press event in Python 2.7

您需要下载并安装pywin32

【讨论】:

    【解决方案3】:

    这是基于子进程的现实答案,适用于 Windows 7。

    p = Popen([batch_file], stdout=PIPE, stdin=PIPE, bufsize=1, shell=True)
    while p.poll() is None:
        line = p.stdout.readline()
        if line.startswith('End'):
            p.communicate('\r\n')
    

    【讨论】:

      猜你喜欢
      • 2021-07-05
      • 2017-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-07
      • 2019-01-13
      相关资源
      最近更新 更多