-1

Dans mon projet, j'utilise argprse pour passer des arguments et quelque part dans le script j'utilise le multiprocessing pour faire le reste des calculs. Script fonctionne très bien si je l'appelle à partir de l'invite de commande par ex.Le multiprocessing Python déclenche une erreur avec argparse et pyinstaller

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

Mais après la conversion à l'aide exe commande à l'aide Pyinstaller "pyinstaller --onefile complete_script.py" il jette

erreur

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

Toute suggestion comment pourrais-je faire ce travail. Ou toute autre alternative. Mon but est de créer une application exe que je peux appeler dans un autre système où Python n'est pas installé.

Voici les détails de mon poste de travail:

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

Copié de commentaire:

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() 

Répondre

0

Je peut être expliquer l'évidence, mais vous ne nous donnent pas beaucoup d'informations à travailler avec.

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

Ce genre d'appel me dit que votre parser est configuré pour accepter au moins ces 2 arguments, ceux marqués avec « --arg1 » et « --arg2 ».

L'erreur me dit que cet analyseur (ou peut-être un autre) est de voir aussi cette chaîne:

--multiprocessing-fork 1448 

Peut-être généré par le code de multitraitement. Il serait bon de voir la partiede l'erreur, juste pour confirmer quel analyseur se plaint.

L'une de mes premières contributions open source à Python consistait à améliorer les avertissements sur le multitraitement sous Windows.

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

Est-ce votre analyseur protégé par un bloc if __name__? Cet analyseur particulier devrait-il être appelé lorsqu'il est exécuté dans une fourchette? Vous avez probablement conçu l'analyseur pour fonctionner lorsque le programme est appelé en tant que script autonome. Mais quand arrive-t-il quand il est importé?

+0

Cela pourrait l'information utile pour travailler pour: [ '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 (): Piscine = Piscine (process = CPU_COUNT) jobs = [pool.apply_async (fonctions_cible, args = (i,) pour i dans input_array)] pool.close() ['code'] –

+0

Quand 'main' est-il appelé? Sur l'importation ou seulement par un bloc 'est __name __...'? – hpaulj

+0

main() est appelée par __name__ == '__main__' bloc –

1

(un peu tard, mais il peut être utile pour quelqu'un d'autre à l'avenir ...)

J'ai eu le même problème, après quelques recherches, j'ai trouvé this multiprocessing pyInstaller recipe que les États:

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.

Ajout cette ligne de code a résolu le problème pour moi.