Написах този малък тестов клас въз основа на проблем с Python - затворен/коригиран и изглежда, че е възникващи в Python 2.7.1 на Fedora 15.
from subprocess import Popen, PIPE
from threading import Thread
OUTPUT = "asl;dkfhqwiouethnjzxvnhsldfhuyasdhofuiweqamchuisemfawepfhuaipwemhfuaehfclkuehnflw ehfcoiuwehfiuwmhefuiwehfoiuhSfcl hfulh fuiqhuif huiwafh uiahf iUH fhh flkJH fl HASLFuhSAIULFhSUA HFulSAHfOI SUFChiuwqhncriouweycriuowanbyoUIWCryu iWyruawyrouiWYRcoiu YCRoiuNr uyr oUIAWryocIUWRNyc owuroiuNr cuWyrnawueitcnoy U IuiR yiuowaYnorc oWIUAr coiury iuoAW rnuoi asdfsdfd\n"
class X(Thread):
def __init__(self):
Thread.__init__(self)
def run(self):
print("Running")
for i in xrange(10):
s = Popen(
"cat /tmp/junk",
shell=True,
stdout=PIPE,
universal_newlines=True
)
output = s.communicate()[0]
if not output == OUTPUT:
print("Error: %r" % output)
XThreads = set([])
for i in xrange(1000):
XThreads.add(X())
for x in XThreads:
x.start()
Просто създайте файл, /tmp/junk в този случай, който има съдържанието на OUTPUT
, без последния нов ред.
Изпълнявайки това, бихте очаквали да видите "Running" на всеки ред. Въпреки това, понякога се показва " Работи" или "Работи Работи\n\n Работи".
(Премахнато цитиране на действителния проблем, тъй като това беше фалшив симптом, благодарение на отговора на @phihag).
Действителният проблем: https://stackoverflow.com/questions/9338409/python-subprocess-popen-corrupts-binary-streams