Supposons un fichier de module Python MDL.py contient le code requis à la fin du fichier mdl.py afin qu'il puisse être utilisé comme script ainsi qu'un module importable. Maintenant, pouvons-nous exécuter Script mdl.py par la commande suivante à Python Shell?
3 Réponses :
Si le module est configuré correctement, l'appel suivant doit fonctionner:
python -m mdl
Quel est le -m pour?
Pour spécifier Nom du module code>. Lorsque vous invoquez Python, vous pouvez spécifier l'une de ces options: Python [-bbdehiioqssuvvwx?] [-C Commande | -M Nom du module | Script | -] [args] code>
Oui, vous pouvez exécuter un script en l'important.
Considérez que vous avez fichier mdl.py:
print("foo")
if __name__ == "__main__":
print("bar")
Vous pouvez le faire, mais ce n'est pas considéré comme un bon style. L'importation d'un module ne doit idéalement pas avoir d'effets secondaires, à l'exception de la création des fonctions et des objets définis dans le module disponibles.
Le moyen canonique de structurer votre module peut être vu dans l'exemple ci-dessous. P>
si __Name__ == '__Main __' code> bloc. Li>
ul> Si vous exécutez le module sous forme de script, le nom __ __ code> du module est défini sur '__ Main __' code>. Si vous importez le module, le nom est défini sur le nom du module. P> Donc, si vous donnez la commande python3 pdfinfo.py foo.pdf code> Il extraire des informations de la fichier foo.pdf code>. p> si vous faites import pdfinfo code> dans python, il fera pdfinfo.pdfinfo code> disponible sur votre Programme. p> Exemple: P>
# file: pdfinfo.py
# vim:fileencoding=utf-8:fdm=marker:ft=python
"""Module to retrieve information from a PDF file."""
import sys
import logging
def pdfinfo(path):
lookups = (b'/Author', b'/Creator', b'/Producer', b'/CreationDate', b'/ModDate')
logging.debug(f'reading {path}')
with open(path, 'rb') as f:
data = f.read()
# Find the trailer, and the Info reference in the trailer
istart = data.find(b'\ntrailer') + 8
istart = data.find(b'/Info', istart) + 6
iend = data.find(b'R', istart) - 1
# Extract the Info object number and generation
objid = data[istart:iend].strip()
logging.debug('Info object is ' + objid.decode('ascii'))
ostart = data.find(objid + b' obj')
ostart = data.find(b'<<', ostart) + 3
oend = data.find(b'>>', ostart)
# For now.
# return data[ostart:oend]
info = data[ostart:oend]
locations = [
(data.find(item), item.decode('ascii')) for item in lookups if item in info
]
locations.sort(key=lambda i: i[0])
logging.debug('found ' + ' '.join(t[1] for t in locations))
return locations
# Run a test.
def _main(argv):
"""
Entry point for pdfinfo.py.
Arguments:
argv: command line arguments; names of PDF files to scan.
"""
logging.basicConfig(level='DEBUG', format='%% %(levelname)s: %(message)s')
for fn in argv:
logging.info(pdfinfo(fn))
print('-----------------------------------------')
sys.stdout.flush()
if __name__ == '__main__':
_main(sys.argv[1:])
L'avez-vous essayé? Que s'est-il passé? Est-ce que
mdl.py code> contient unsi __name__ == "__main __": code> garde pour tous les indicatifs?