ile başarısız oluyor. Projemde, __main__'de birden çok işlem oluşturmak için Python'un multiprocessing
kitaplığını kullanıyorum. Proje, PyInstaller 2.1.1 kullanılarak tek bir Windows EXE'de paketlenmiştir.PyInstaller yerleşik Windows EXE, çok işlemcili
Öyle gibi yeni süreçler oluşturun:
from multiprocessing import Process
from Queue import Empty
def _start():
while True:
try:
command = queue.get_nowait()
# ... and some more code to actually interpret commands
except Empty:
time.sleep(0.015)
def start():
process = Process(target=_start, args=args)
process.start()
return process
Ve __main__ içinde
: bir EXE içinde uygulamayı ambalaj ve onu başlatırkenif __name__ == '__main__':
freeze_support()
start()
yazık ki, ben WindowsError
5 veya 6 olsun (görünüyor rastgele) bu satırda:
command = queue.get_nowait()
PyInstaller'in ana sayfasındaki bir reçete, Uygulamayı tek bir dosya olarak paketlerken, Windows'da çoklu işlemeyi etkinleştirmek için kodumu değiştirmem gerekiyor.
Burada kod üreten ediyorum:
import multiprocessing.forking
import os
import sys
class _Popen(multiprocessing.forking.Popen):
def __init__(self, *args, **kw):
if hasattr(sys, 'frozen'):
# We have to set original _MEIPASS2 value from sys._MEIPASS
# to get --onefile mode working.
# Last character is stripped in C-loader. We have to add
# '/' or '\\' at the end.
os.putenv('_MEIPASS2', sys._MEIPASS + os.sep)
try:
super(_Popen, self).__init__(*args, **kw)
finally:
if hasattr(sys, 'frozen'):
# On some platforms (e.g. AIX) 'os.unsetenv()' is not
# available. In those cases we cannot delete the variable
# but only set it to the empty string. The bootloader
# can handle this case.
if hasattr(os, 'unsetenv'):
os.unsetenv('_MEIPASS2')
else:
os.putenv('_MEIPASS2', '')
class Process(multiprocessing.Process):
_Popen = _Popen
class SendeventProcess(Process):
def __init__(self, resultQueue):
self.resultQueue = resultQueue
multiprocessing.Process.__init__(self)
self.start()
def run(self):
print 'SendeventProcess'
self.resultQueue.put((1, 2))
print 'SendeventProcess'
if __name__ == '__main__':
# On Windows calling this function is necessary.
if sys.platform.startswith('win'):
multiprocessing.freeze_support()
print 'main'
resultQueue = multiprocessing.Queue()
SendeventProcess(resultQueue)
print 'main'
bu "çözüm" Benim hayal kırıklığı bir, o böyle bir yazıldığı için o ikincisi de, yama tam olarak ne kesinlikle belirsiz ve, yani kıvrık yol, hangi parçaların çözüm olduğunu ve sadece bir örnek olduğunu ortaya çıkarmanın imkânsız hale gelmesine neden olur.
Herkes bu konuda biraz ışık tutabilir ve PyInstaller tarafından oluşturulmuş tek dosya Windows yürütülebilir dosyalarında çok işlemcili bir projede tam olarak neyin değiştirilmesi gerektiğini anlamak için bilgi sağlayabilir mi?
Python multiprocessing docs tarifi sorunu çözer mi? – dano
Tarifenin nasıl uygulanacağı belli değil (en azından benim için). Python komut dosyamda ilgisiz iki özel durum daha ortaya çıkardığından, yukarıdaki kodu ana Python betiğimde yapıştırmak işe yaramıyor. Hangi tarifin temelde hatalı olduğunu söyledi. – nikola
Tarifeyi sadece bağımsız bir komut dosyası olarak çalıştırırsanız, hatasız çalışır mı? – dano