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.)
Ici, vous pouvez utiliser le package python appelé stickytape. https://pypi.org/project/stickytape/
stickytape = ruban adhésif
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
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)
Exécutez la commande suivante (bien sûr, tout ce qui se trouve dans onefile.py est OK)
$ stickytape main.py > onefile.py
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é.
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.)
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.
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 |
@Wataoka_Koki |
Suivez-nous sur Twitter!
Recommended Posts