-1

In meinem Projekt verwende ich argprse, um Argumente zu übergeben und irgendwo im Skript verwende ich Multiprocessing, um den Rest der Berechnungen zu tun. Skript funktioniert gut, wenn ich es von der Eingabeaufforderung für ex aufrufen.Python Multiprozessing löst Fehler mit Argparse und Pyinstaller

"python complete_script.py --arg1=xy --arg2=yz".

Aber es nach der Konvertierung Pyinstaller mit dem Befehl "pyinstaller --onefile complete_script.py" exe mit wirft

Fehler

" error: unrecognized arguments: --multiprocessing-fork 1448"

Irgendwelche Vorschläge, wie ich diese Arbeit machen könnte. Oder irgendeine andere Alternative. Mein Ziel ist es, eine Exe-Anwendung zu erstellen, die ich in einem anderen System aufrufen kann, in dem Python nicht installiert ist.

Hier sind die Details meiner Arbeitsstation:

Platform: Windows 10 
Python : 2.7.13 <installed using Anaconda> 
multiprocessing : 0.70a1 
argparse: 1.1 

von Kommentar kopiert:

def main(): 
    main_parser = argparse.ArgumentParser() 
    < added up arguments here> 
    all_inputs = main_parser.parse_args() 
    wrap_function(all_inputs) 


def wrap_function(all_inputs): 
    <Some calculation here > 
    distribute_function(<input array for multiprocessing>) 

def distribute_function(<input array>): 
    pool = Pool(process = cpu_count) 
    jobs = [pool.apply_async(target_functions, args = (i,) for i in input_array)] 
    pool.close() 

Antwort

0

ich das Offensichtliche zu erklären sein, aber Sie uns nicht viele Informationen geben, arbeiten mit.

python complete_script.py --arg1=xy --arg2=yz 

Diese Art von Anruf sagt mir, dass Ihre parser Setup mindestens diese zwei Argumente, diejenigen mit ‚--arg1‘ und ‚--arg2‘ gekennzeichnet zu akzeptieren.

Der Fehler sagt mir, dass dieser Parser (oder vielleicht auch einige andere) auch diese Zeichenfolge ist zu sehen:

--multiprocessing-fork 1448 

möglicherweise durch den Multiprocessing-Code generiert. Es wäre gut, den usage Teil des Fehlers zu sehen, nur um zu bestätigen, welcher Parser sich beschwert.

Einer meiner ersten Open-Source-Beiträge zu Python war, die Warnungen über Multiprocessing unter Windows zu verbessern.

https://docs.python.org/2/library/multiprocessing.html#windows

Ist Ihr Parser durch einen if __name__ Block geschützt? Soll dieser Parser aufgerufen werden, wenn er in einer Verzweigung ausgeführt wird? Sie haben den Parser wahrscheinlich so entwickelt, dass er funktioniert, wenn das Programm als eigenständiges Skript aufgerufen wird. Aber wann passiert es, wenn es importiert wird?

+0

Dies könnte nützliche Informationen zur Arbeit für: [ 'Code'] def main(): main_parser = argparse.ArgumentParser() all_inputs = main_parser.parse_args() wrap_function (all_inputs) def wrap_function (all_inputs): distribute_function () def distribute_function (): Pool = Pool (process = cpu_count) jobs = [pool.apply_async (target_functions, args = (i,) für i in input_array)] pool.close() ['code'] –

+0

Wann wird 'main' aufgerufen? Beim Import oder nur durch einen 'is __name __...' Block? – hpaulj

+0

main() wird von __name__ == '__main__' Block –

1

(Ein bisschen spät, aber es kann für jemand anderen in der Zukunft nützlich sein ...)

Ich hatte das gleiche Problem, nach einigen Recherchen ich this multiprocessing pyInstaller recipe gefunden, die besagt:

When using the multiprocessing module, you must call

multiprocessing.freeze_support()

straight after the if __name__ == '__main__': line of the main module.

Please read the Python library manual about multiprocessing.freeze_support for more information.

Hinzufügen Diese Codezeile löste das Problem für mich.