web-dev-qa-db-fra.com

Comment savoir quelles méthodes, propriétés, etc. un module python possède

Disons que j'importe un module. Afin de pouvoir en tirer le meilleur parti possible, je voudrais savoir quelles propriétés, méthodes, etc. je peux utiliser. Y a-t-il un moyen de le savoir?

À titre d'exemple: Détermination des programmes en cours d'exécution en Python

Dans cette ligne:

os.system('WMIC /OUTPUT:C:\ProcessList.txt PROCESS get Caption,Commandline,Processid')

Disons que je voulais également imprimer la mémoire consommée par les processus. Comment savoir si c'est possible? Et quelle serait la "bonne" étiquette pour cela? (tout comme l'auteur utilise 'Commandline', 'ProcessId')

De même, en cela:

import win32com.client
def find_process(name):
    objWMIService = win32com.client.Dispatch("WbemScripting.SWbemLocator")
    objSWbemServices = objWMIService.ConnectServer(".", "root\cimv2")
    colItems = objSWbemServices.ExecQuery(
         "Select * from Win32_Process where Caption = '{0}'".format(name))
    return len(colItems)

print find_process("SciTE.exe")

Comment puis-je faire en sorte que la fonction imprime également la mémoire consommée, le chemin exécutable, etc.?

32
ldmvcd

Quant aux modules Python, vous pouvez faire

>>> import module
>>> help(module)

et vous obtiendrez une liste des méthodes prises en charge (plus exactement, vous obtenez la docstring, qui peut ne pas contenir toutes les méthodes). Si vous le souhaitez, vous pouvez utiliser

>>> dir(module)

bien que maintenant vous obtiendrez juste une longue liste de toutes les propriétés, méthodes, classes etc. dans ce module.

Dans votre premier exemple, vous appelez un programme externe. Bien sûr Python n'a aucune idée des fonctionnalités wmic.exe a. Comment ça devrait?

42
Tim Pietzcker

dir(module) retourne les noms des attributs du module

module.__dict__ Est le mappage entre les clés et les objets attributs eux-mêmes

module.__dict__.keys() et dir(module) sont des listes ayant les mêmes éléments, bien qu'elles ne soient pas égales car les éléments ne sont pas dans le même ordre

il semble que help(module) soit ce dont vous avez vraiment besoin

12
eyquem

Python a une fonction intégrée appelée dir (). Je ne sais pas si c'est à cela que vous faites référence, mais lancez une console interactive python et tapez:

import datetime
dir(datetime)

Cela devrait vous donner une liste de méthodes, de propriétés et de sous-modules

3
dirk

@ldmvcd

Ok, excusez-moi, je pense que vous êtes un débutant et vous ne voyez pas à quelles notions fondamentales je fais référence.

Les objets sont l'abstraction de Python pour les données. Toutes les données d'un programme Python sont représentées par des objets ou par des relations entre les objets. http://docs.python.org/reference/datamodel.html#the-standard-type -hierarchy

Je ne comprends pas pourquoi on l'appelle "abstraction": pour moi, un objet est quelque chose de réel dans la machine, une série de bits organisés selon certaines règles pour représenter des données conceptuelles ou un fonctionnement.

Les noms font référence aux objets. Les noms sont introduits par des opérations de liaison de noms. Chaque occurrence d'un nom dans le texte du programme fait référence à la liaison de ce nom établie dans le bloc fonctionnel le plus à l'intérieur contenant l'utilisation. http://docs.python.org/reference/executionmodel.html#naming-and-binding

.

Un espace de noms est un mappage des noms aux objets. La plupart des espaces de noms sont actuellement implémentés en tant que Python , mais ce n'est normalement pas perceptible en aucune façon (sauf pour les performances), et cela peut changer à l'avenir. Des exemples d'espaces de noms sont: l'ensemble des noms intégrés (contenant des fonctions telles que abs () et les noms d'exception intégrés); les noms globaux dans un module; et les noms locaux dans un invocation de fonction. Dans un certain sens, l'ensemble des attributs d'un objet forme également un espace de noms. http://docs.python.org/tutorial/classes.html#a-Word-about-names-and-objects

.

Soit dit en passant, j'utilise l'attribut Word pour tout nom suivant un point - par exemple, dans l'expression z.real, real est un attribut de l'objet z. À proprement parler, les références aux noms dans les modules sont des références d'attribut: dans l'expression modname.funcname, modname est un objet module et funcname en est un attribut. Dans ce cas, il se trouve qu'il existe un mappage simple entre les attributs du module et les noms globaux définis dans le module: ils partagent le même espace de noms! http://docs.python.org/tutorial/classes.html#a-Word-about-names-and-objects

.

Les espaces de noms sont créés à différents moments et ont des durées de vie différentes. http://docs.python.org/tutorial/classes.html#a-Word-about-names-and-objects

.

L'espace de noms d'un module est automatiquement créé lors de la première importation d'un module. Le module principal d'un script est toujours appelé main . http://docs.python.org/reference/executionmodel.html#naming-and-binding

.

Eh bien, un programme Python est une grosse machine qui joue avec les objets, les références à ces objets, les noms de ces objets et les espaces de noms dans lesquels sont liés les noms et les objets, les espaces de noms étant implémentés comme des dictionnaires .

Donc, vous avez raison: quand je fais référence aux clés, je fais référence aux noms étant les clés dans les divers espaces de noms. Les noms sont arbitraires ou non, selon que les objets pour lesquels ils ont été créés sont des objets utilisateur ou des objets intégrés.

Je vous conseille de lire attentivement les pièces

3.1. Objets, valeurs et types http://docs.python.org/reference/datamodel.html#the-standard-type-hierarchy

et

4.1. Nommer et lier http://docs.python.org/reference/executionmodel.html#naming-and-binding

2
eyquem