我有一个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…”我无法读取任何输出。在
谢谢。在
我想您可能想知道为什么没有看到odev2.py中的任何提示?在
简而言之,将run替换为:
长话短说,有两个问题。在
首先是缓冲。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”以查看差异。在
其次,你的阅读线程使用readline。readline在看到新行之前不会返回,但是odev2.py的提示不会以换行结束。因此,run中的readline在odev2.py发送新行之前不会返回,但是odev2在从您读取一些输入之前不会发送新行。所以你陷入僵局了。在
对此,健壮的解决方案是用非阻塞IO替换readline,它将返回可用的内容。但是,there doesn't seem是在Python2.7中实现这一点的一种可移植方法。所以快速破解就是单字符阅读。所以不去做popen.stdout.readline(),你就是这样popen.stdout.read(1) 一。在
相关问题 更多 >
编程相关推荐