Obtenir des pointeurs vers des membres de structure dans les ctypes Python

Je voulais faire quelque chose comme ça avec les ctypes de Python

typedef struct{
    int x;
    int y;
} point;
point p = {100, 200};
someFunc(&p.y); //Passer un pointeur sur y

Juste là où je l'ai écrit normalement

from ctypes import *

class Point(Structure):
    _fields_ = [("x", c_int), ("y", c_int)]

p = Point(100, 200)
somedll.someFunc(byref(p.y))

TypeError: byref() argument must be a ctypes instance, not 'int'

Être en colère La valeur obtenue avec p.y n'est pas une instance de ctypes, mais juste un nombre entier (en Python), elle ne peut donc pas être référencée par byref.

fais ça

y_offset = Point.y.offset
y_addr = addressof(p) + y_offset
somedll.someFunc(y_addr)

J'ai le pointeur ou l'adresse elle-même, mais c'est probablement la même chose.

Merci Objet de classe (d'une sous-classe de Structure) .nom du membre.offset Semble pouvoir obtenir le décalage de ce membre depuis le début de la structure Si vous obtenez l'adresse du début de la structure et ajoutez le décalage, vous pouvez obtenir l'adresse du membre par une journée ensoleillée.

Au fait Classe objet.membre nom.size Vous pouvez obtenir la taille de ce membre avec

Si vous l'utilisez beaucoup, il vaudrait mieux en faire une fonction comme suit.

def get_address_of_member(obj, member_name):
    return addressof(obj) + obj.__class__.__dict__[member_name].offset

p = Point(100, 200)
somedll.someFunc(get_address_of_member(p, "y"))

Je ne pense pas que ce soit intelligent, mais ça va S'il y a un meilleur moyen, j'apprécierais que vous m'apprendriez.

Recommended Posts

Obtenir des pointeurs vers des membres de structure dans les ctypes Python
Comment obtenir stacktrace en python
Obtenir la date en Python
Comment obtenir les fichiers dans le dossier [Python]
Que faire pour obtenir une feuille de calcul Google en Python
Utilisez os.getenv pour obtenir des variables d'environnement en Python
Comment obtenir le nom de la variable lui-même en python
Comment obtenir le nombre de chiffres en Python
Obtenez des commentaires YouTube en Python
Pour vider stdout en Python
Obtenez le mois dernier en Python
Connectez-vous au site Web en Python
Structure super minuscule en Python
Obtenir la taille du terminal en Python
Obtenir explicitement EOF en python
Parler avec Python [synthèse vocale]
Comment développer en Python
Obtenez des notes Evernote en Python
Publier sur Slack en Python
Obtenez des synonymes japonais avec Python
Développer une bibliothèque pour obtenir la liste des collections Kindle en Python
J'ai essayé "Comment obtenir une méthode décorée en Python"
Pour renvoyer char * dans une fonction de rappel à l'aide de ctypes en Python
Comment obtenir la dernière (dernière) valeur d'une liste en Python
Comment obtenir une liste d'exceptions intégrées pour python
Appuyez sur REST en Python pour obtenir des données de New Relic
Autoriser l'exécution rapide des scripts Python dans Cloud Run à l'aide du répondeur
Appelez l'API github en python pour obtenir des informations sur la demande d'extraction
[Python] Comment faire PCA avec Python
Lien pour commencer avec python
Convertir Markdown en PDF en Python
Obtenir des données de Quandl en Python
Comment collecter des images en Python
Comment utiliser SQLite en Python
Dans la commande python, python pointe vers python3.8
Essayez de calculer Trace en Python
Comment démarrer avec Python
Obtenir, publier un mémo de communication en Python
Comment utiliser Mysql avec python
Comment envelopper C en Python
Comment utiliser ChemSpider en Python
6 façons d'enchaîner des objets en Python
Comment utiliser PubChem avec Python
Obtenez le chemin du bureau en Python
Obtenez le nom d'hôte en Python
Version Python pour obtenir les ports inutilisés
Comment gérer le japonais avec Python
Démarrez avec Python avec Blender
Une alternative à `pause` en Python
Que faire si vous obtenez moins zéro en Python
Comment obtenir une chaîne à partir d'un argument de ligne de commande en python
Accédez à l'API New Relic en Python pour obtenir l'état du serveur
Obtenez des données supplémentaires vers LDAP avec python
J'ai essayé d'implémenter PLSA en Python
[Introduction à Python] Comment utiliser la classe en Python?
Essayez de vous connecter à qiita avec Python
Obtenez des taux de change à partir des taux de change ouverts en Python
Installez Pyaudio pour lire des vagues en python
Obtenir l'équilibre Suica en Python (en utilisant libpafe)
J'ai essayé d'implémenter la permutation en Python