Combinez plusieurs fichiers python en un seul fichier python

Chose que tu veux faire

Par exemple, un projet où main.py appelle un autre fichier ...

- main.py
- sub1.py
- folder
    - sub2.py

↓ ↓ ↓ Les fonctions et classes qui en dépendent ...

onefile.py

Gyu! !! !! Je suis surpris.

(La motivation est que je me suis demandé si je pourrais facilement exécuter le fichier python géré par le projet avec google colab.)

Solution

Ici, vous pouvez utiliser le package python appelé stickytape. https://pypi.org/project/stickytape/

stickytape = ruban adhésif

Expérience

Tout le code expérimenté est publié sur Github, donc pour référence.

install Vous pouvez maintenant utiliser la commande stickytape (pas de nom de commande ...)

$ pip install stickytape

Préparez le dossier

La configuration est la suivante.

- main.py
- sub1.py
- folder
    - sub2.py

folder/sub2.py Créez une classe Apple comme vous le souhaitez et donnez-lui une propriété value comme vous le souhaitez.

class Apple:

    def __init__(self, value):
        self.value = value

sub1.py Je ferai une fonction moyenne le cas échéant.

sub1.py


def mean(a, b):
    return (a+b)/2

main.py Importez-le, calculez-le correctement et affichez-le correctement.

from sub1 import mean
from folder.sub2 import Apple

apple1 = Apple(value=100)
apple2 = Apple(value=200)

result = mean(apple1.value, apple2.value)
print(result)

Maintenant! Dans un seul fichier!

Exécutez la commande suivante (bien sûr, tout ce qui se trouve dans onefile.py est OK)

$ stickytape main.py > onefile.py

résultat

Le fichier ʻonefile.py` suivant sera généré.

#!/usr/bin/env python


import contextlib as __stickytape_contextlib

@__stickytape_contextlib.contextmanager
def __stickytape_temporary_dir():
    import tempfile
    import shutil
    dir_path = tempfile.mkdtemp()
    try:
        yield dir_path
    finally:
        shutil.rmtree(dir_path)

with __stickytape_temporary_dir() as __stickytape_working_dir:
    def __stickytape_write_module(path, contents):
        import os, os.path

        def make_package(path):
            parts = path.split("/")
            partial_path = __stickytape_working_dir
            for part in parts:
                partial_path = os.path.join(partial_path, part)
                if not os.path.exists(partial_path):
                    os.mkdir(partial_path)
                    open(os.path.join(partial_path, "__init__.py"), "w").write("\n")

        make_package(os.path.dirname(path))

        full_path = os.path.join(__stickytape_working_dir, path)
        with open(full_path, "w") as module_file:
            module_file.write(contents)

    import sys as __stickytape_sys
    __stickytape_sys.path.insert(0, __stickytape_working_dir)

    __stickytape_write_module('sub1.py', 'def mean(a, b):\n    return (a+b)/2')
    __stickytape_write_module('folder/sub2.py', 'class Apple:\n\n    def __init__(self, value):\n        self.value = value')
    from sub1 import mean
    from folder.sub2 import Apple
    
    apple1 = Apple(value=100)
    apple2 = Apple(value=200)
    
    result = mean(apple1.value, apple2.value)
    print(result)

Pendant un moment, c'est devenu "Qu'est-ce qui ne va pas!?", Mais quand j'ai exécuté ça ...

150.0

Le résultat correct du calcul est affiché en toute sécurité.

Expérimentez avec Google Colab

J'ai copié et exécuté le code ci-dessus dans Google Colab.

Comme indiqué ci-dessous, 150,0 était affiché en toute sécurité.

(Ne vous inquiétez pas pour le chat de couleur arc-en-ciel qui marche.)

スクリーンショット 2020-06-25 12.38.44.png

Scripté

C'est un aparté d'ici.

La commande stickytape est longue, et je suis paresseux pour spécifier le répertoire du fichier généré à chaque fois, donc je pense que c'est une bonne idée de le script comme suit.

- main.py
- sub1.py
- folder
    - sub2.py
- scripts
    - tape.sh
- build
    - onefile.py

tape.sh


#valeur initiale
entry="main.py"
output="onefile.py"

#option
while getopts e:o: OPT
do
	case $OPT in 
		"e" ) entry=${OPTARG};;
		"o" ) output=${OPTARG};;
	esac
done

#Courir
stickytape ${entry} > "build/${output}"

La commande suivante exécutera main.py et générera onefile.py dans le répertoire de construction.

$ sh scripts/tape.sh

J'ai également préparé des options.

Nom de l'option La description
-e Nom de fichier du point d'entrée
-o Nom du fichier de sortie
$ sh scripts/tape.sh -e <nom de fichier> -o <nom de fichier>

Le répertoire généré est corrigé avec build, donc si vous ne l'aimez pas, changez-le.

Auto-introduction

Si vous l'écrivez au début, cela vous gênera, alors laissez-moi vous présenter tranquillement à la fin.

Nom Aki Wataoka
école École supérieure de l'université de Kobe
Recherche de premier cycle Apprentissage automatique,Traitement de la voix
Recherche diplômée Apprentissage automatique,justice,Modèle de génération, etc
Twitter @Wataoka_Koki

Suivez-nous sur Twitter!

Recommended Posts

Combinez plusieurs fichiers python en un seul fichier python
[Python & Unix] Combinez plusieurs fichiers PDF en un seul.
Combinez plusieurs fichiers csv en un seul fichier csv avec python (en supposant qu'une seule ligne d'en-tête)
Combinez plusieurs fichiers Excel chargés à l'aide de pandas en un seul
Combinez les arguments de la fonction python en une seule variable
Convertissez plusieurs fichiers jpg en un seul fichier PDF
Décompressez plusieurs fichiers compressés (Python)
[Python] Envoyer gmail avec python: envoyez un par un avec plusieurs fichiers image en pièce jointe
[Blender] Scinder le script Blender en plusieurs fichiers
Gérez plusieurs versions de python en un seul jupyter
Combinez les arguments de la fonction python en une seule variable
Combinez plusieurs fichiers python en un seul fichier python
[Python & Unix] Combinez plusieurs fichiers PDF en un seul.
Combinez plusieurs fichiers Excel chargés à l'aide de pandas en un seul
Fichier python de script
Combinez plusieurs CSV et trames de données en une seule trame de données à grande vitesse [vitesse 60x]
[Automation] Convertissez le code Python en fichier exe
Traitement de fichiers Python
Code Python qui supprime les espaces contigus en un
Combinez plusieurs fichiers Excel chargés à l'aide de pandas en un seul
Combinez plusieurs fichiers python en un seul fichier python
Connectez plusieurs vidéos en un seul coup en utilisant OpenCV!
[Python & Unix] Combinez plusieurs fichiers PDF en un seul.
Plusieurs graphiques sont affichés dans une seule fenêtre (python)
Convertissez plusieurs fichiers proto à la fois avec python
Exemple pour mettre Python Kivy dans un fichier
Un script qui combine plusieurs pages d'un fichier PDF en une seule page sans marges
Lecture de texte Python pour plusieurs lignes et une ligne
Convertissez plusieurs blocs-notes Jupyter ensemble en un fichier html
Supprimer les en-têtes de fichiers CSV à plusieurs formats avec python
Opérations sur les fichiers en Python
[Python] Opération de fichier / répertoire
Une doublure en Python
[Note] Lecture de fichier ~ Python ~
Traitement de fichiers en Python
Doublure Zundko One en python
[Python] Créer plusieurs répertoires
Exécuter automatiquement le fichier python
Lecture du fichier pyc (Python 3.5.2)
Manipulation de fichiers avec Python
Python - Marquage des fichiers MP3
Lire le fichier csv Python
lecture de fichier externe python
[Python] Lecture de fichiers CSV
[R] [Python] Memo pour lire plusieurs fichiers csv dans plusieurs fichiers zip