2010-07-27 7 views
2

J'ai quelques petites applications python qui utilisent cx_Oracle pour se connecter à une base de données Oracle. Je déploie ces applications en les compilant avec py2exe, ce qui fonctionne bien dans de nombreux cas. Le problème est qu'il n'y a pas de version standard du client Oracle (9i et 10g par exemple) parmi les nombreuses personnes qui ont besoin d'installer ceci, et il serait très frustrant d'essayer d'uniformiser tout le monde sur un seul client Oracle. version. J'utilise le client 9.2 avec cx_Oracle 4.4.1 pour 9i pour le moment, et donc quand je py2exe l'exe résultant inclut la bibliothèque cx_Oracle 4.4.1 et ne fonctionnera pas avec les clients 10g. Je n'utilise aucune fonctionnalité spécifique de l'une des versions d'Oracle, donc je n'ai aucune raison de m'inquiéter de la version du client utilisée, à l'exception des problèmes de compatibilité de cx_Oracle.Déploiement de cx_Oracle sur différentes versions d'Oracle Client

La solution idéale serait de compiler en quelque sorte une version complètement indépendante du client Oracle installé sur la machine. Si ce n'est pas possible, je serais prêt à compiler des exes séparés pour chaque version majeure d'Oracle (my_app_9i.exe, my_app_10g.exe, etc) mais je ne peux pas trouver un moyen facile de le faire même depuis l'installation d'un new cx_Oracle écrase mon ancienne version, je devrais continuer à échanger la bibliothèque pour compiler les autres versions chaque fois que je fais un changement.

Tous les conseils ou autres options sont les bienvenus.

Répondre

3

Si vous souhaitez créer plusieurs versions de cx_Oracle (par exemple: cx_Oracle10g, cx_Oracle11g, etc.), vous devez modifier le script cx_Oracle setup.py. La dernière étape du script est un appel à setup(); le premier paramètre est le nom du module à construire. Tout ce que vous avez à faire est de changer "cx_Oracle" en "cx_Oracle" + ver, où ver est 10g, 11g, etc. Vous pouvez soit créer plusieurs scripts et le coder en dur, soit ajouter un autre paramètre à setup.py pour le sélectionner dynamiquement.

Bien sûr, une fois que vous avez cela, vous avez besoin d'un mécanisme pour charger le bon module lors de l'exécution. Pour ce faire, vous voulez créer votre propre module cx_Oracle qui a un fichier __init__.py qui ressemble à ceci:

try: 
    from cx_Oracle9g import * 
except ImportError: 
    try: 
    from cx_Oracle10g import * 
    except ImportError: 
    try: 
     from cx_Oracle11g import * 

Tout ce que vous devez faire est de transporter votre module sur mesure cx_Oracle ainsi que le module cx_OracleXg correct avec votre application .

Alternativement, vous pouvez avoir votre module personnalisé cx_Oracle vérifier dynamiquement pour chaque bibliothèque de client Oracle disponible (9g, 10g, 11g, etc), puis seulement importer le bon module cx_OracleXg correspondant. Dans ce cas, vous ne devez envoyer qu'un seul fichier binaire contenant votre module cx_Oracle personnalisé plus tous les modules cx_OracleXg.

+0

Merci pour cette solution élégante et à l'épreuve du temps, désolé, il m'a fallu tellement de temps pour que je l'accepte. – cecilkorik

Questions connexes