在后台执行外部Python文件并获得Python输出

2024-09-27 21:29:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个python文件,它接受一些输入并根据这些输入打印输出。我尝试在另一个脚本中执行此脚本。我需要做的就是向这个文件发送一些参数,然后在这个脚本中获得输出。在

我需要执行的脚本:

while True:
  print("Sabah 1")
  print("Oglen 2")
  print("Aksam 3")
  print("Gece 4")
  print("---------")


  secim = raw_input("Gun icerisindeki zaman dilimini giriniz")

  isim = raw_input("Isminizi giriniz.")


  if (secim=='1') : 
      print("Gunaydin"+isim)
  elif (secim == '2'):
      print("Tunaydin"+isim)
  elif (secim == '3'):
      print("iyi aksamlar"+isim)
  elif (secim == '4'):
      print("Iyi geceler"+isim)
  else:
      print("Program sonlandiriliyor")
      break

应执行上述脚本的脚本:

^{pr2}$

问题是第二个脚本的输出继续打印“Main Thread…”我无法读取任何输出。在

谢谢。在


Tags: 文件脚本trueinput参数rawprintelif
1条回答
网友
1楼 · 发布于 2024-09-27 21:29:46

我想您可能想知道为什么没有看到odev2.py中的任何提示?在

简而言之,将run替换为:

def run():
    args = ['python','-u','odev2.py','arg1','arg2']
    popen = subprocess.Popen(args,shell=False,stdout=subprocess.PIPE)
    while not can_break:
        sys.stdout.write(popen.stdout.read(1))

长话短说,有两个问题。在

首先是缓冲。IO是昂贵的,因此文件对象有时会收集缓冲区中的数据,而不是立即写出数据,而是在缓冲区已满时才将数据写出。内置文件对象(比如系统标准输出)将根据写入的内容决定缓冲区。如果它们正在向终端写入数据,那么它们将关闭缓冲,以便输出立即发送给用户。但是如果他们正在写一个文件,他们将缓冲,使之更有效。在

因此,当您在命令行运行odev2.py时,print正在写入一个终端,因此它是无缓冲的,您的提示会立即出现。但是当您使用子进程(stdout=PIPE)运行odev2.py时,odev2.py将获得一个管道作为标准输出,因此文件对象缓冲区。这意味着你看不到提示。在

您可以在命令行中使用“python odev2.py arg1 arg2 | cat”看到相同的效果。这会将标准输出设置为管道,您不会看到任何提示,但odev2.py将等待您输入。在

这个缓冲问题可以通过让odev2.py自己编写提示(而不是让raw_input打印它们)然后调用系统stdout.flush()在适当的时候。但是一种快速而肮脏的方法是使用-u标志运行python,它关闭所有缓冲。请尝试“python-u odev2.py arg1 arg2 | cat”以查看差异。在

Note: -u turns off all buffering, which can have a huge impact on performance. So this is only a quick and dirty solution

其次,你的阅读线程使用readline。readline在看到新行之前不会返回,但是odev2.py的提示不会以换行结束。因此,run中的readline在odev2.py发送新行之前不会返回,但是odev2在从您读取一些输入之前不会发送新行。所以你陷入僵局了。在

对此,健壮的解决方案是用非阻塞IO替换readline,它将返回可用的内容。但是,there doesn't seem是在Python2.7中实现这一点的一种可移植方法。所以快速破解就是单字符阅读。所以不去做popen.stdout.readline(),你就是这样popen.stdout.read(1) 一。在

相关问题 更多 >

    热门问题