web-dev-qa-db-fra.com

Construire Python et plus sur les modules manquants

J'ai un autre fil demandant de l'aide sur "zlib manquant". Avec l'aide de Nice, le problème a été résolu (presque).

Maintenant, je suis intéressé à construire moi-même Python (sur Ubuntu 10.10).

Quelques questions importantes ont retenu mon attention:

  1. Après avoir construit Python (disons 2.7.1), dois-je reconstruire Python si j'ai des modules manquants?)

  2. Existe-t-il un moyen de savoir quels modules seront manquants avant de construire Python? Dites sqlite3. J'ai sqlite3 installé pour le système par défaut (Python 2.6.6), et je peux l'importer dans Python 2.6.6 Shell. Maintenant, j'utilise pythonbrew pour construire 2.7.1, et dans le Shell Je ne peux pas importer sqlite3 car _sqlite3 n'est pas disponible. Je suis sûr qu'il en manque quelques-uns de plus importants dont j'ai besoin pour un développement futur (comme Django ..).

Je suis prêt à apprendre à construire sans utiliser pythonbrew .

Veuillez partager avec moi votre expérience dans la construction d'une autre version de Python, et comment aborderiez-vous le problème des modules manquants? Existe-t-il une solution pratique pour construire Python?

Je n'ai jamais pris la peine d'en construire un moi-même, alors soyez indulgent avec moi. Je commence à réaliser l'importance d'apprendre et d'en construire un moi-même! Merci beaucoup!


[~ # ~] modifier [~ # ~]

Je vous remercie d'abord de toutes vos contributions. Ils signifiaient beaucoup. J'ai fait le bâtiment.

Python build finished, but the necessary bits to build these modules were not found:
_bsddb             _curses            _curses_panel   
_tkinter           bsddb185           bz2             
dbm                gdbm               readline        
sunaudiodev        _sqlite3                                    
To find the necessary bits, look in setup.py in detect_modules() for the module's name.

J'ai obtenu sqlite3 et readline par

Sudo apt-get install libreadline6 libreadline6-dev
Sudo apt-get install libsqlite3-dev

J'ai essayé de les importer, mais toujours "aucun module nommé xxxx".

À AskUbunt J'ai en fait demandé aux gens comment obtenir les commandes précédentes parce que je ne pouvais pas utiliser cette fonctionnalité lorsque je suis dans Python 2.7.1 Shell. Je pense que c'est dû à readline. Readline

J'ai installé Python-2.7.1 sous ce répertoire:/home/jwxie518/python27 /

J'ai regardé setup.py, j'ai trouvé les lignes suivantes:

# The sqlite interface
sqlite_setup_debug = False   # verbose debug prints from this script?

# We hunt for #define SQLITE_VERSION "n.n.n"
# We need to find >= sqlite version 3.0.8
sqlite_incdir = sqlite_libdir = None
sqlite_inc_paths = [ '/usr/include',
                     '/usr/include/sqlite',
                     '/usr/include/sqlite3',
                     '/usr/local/include',
                     '/usr/local/include/sqlite',
                     '/usr/local/include/sqlite3',
                   ]

Tous les chemins répertoriés ci-dessus n'existent pas. Donc je suppose que je dois installer sqlite3 manuellement? J'ai une autre référence ici (c'est en chinois cependant)

# Download the latest and extract
# Go into the extracted directory
./configure --prefix=/home/jwxie518/python27/python
make && make install
# Then edit python-2.7 's setup.py before rebuild it
# Sample (add these two lines to the end....)
'~/share/software/python/sqlite-3.6.20/include',
'~/share/software/python/sqlite-3.6.20/include/sqlite3',

# Then rebuild python like how we did before

Je suis allé dans mon répertoire où j'ai installé sqlite3. J'ai trouvé uniquement/sqlite3.h . Je suis donc retourné et j'ai vérifié /usr/include/. Je ne trouve que sqlite3.h aussi.

Que se passe-t-il? Readline est également non importable.


3E EDIT J'ai tout recommencé, sauf que je n'ai pas réinstallé sqlite3.

# Extract Python-2.7.1
# cd into Python-2.7.1
# ./configure
make >make.out 2>&1
less make.out

make.out est ici: http://Pastebin.com/raw.php?i=7k3BfxZQ

Je ne pouvais toujours pas importer sqlite3. Je suis donc allé dans setup.py et j'ai apporté des modifications:

# We hunt for #define SQLITE_VERSION "n.n.n"
# We need to find >= sqlite version 3.0.8
sqlite_incdir = sqlite_libdir = None
sqlite_inc_paths = [ '/usr/include',
                     '/usr/include/sqlite',
                     '/usr/include/sqlite3',
                     '/usr/local/include',
                     '/usr/local/include/sqlite',
                     '/usr/local/include/sqlite3',
                     '/home/jwxie518/python-mod/include/sqlite',
                     '/home/jwxie518/python-mod/include/sqlite3',
                   ]

Là encore, j'ai tout couru (cette fois, j'ai aussi fait nettoyer )

La sortie est ici: http://Pastebin.com/raw.php?i=8ZKgAcWn

Selon la sortie, je ne pense pas que le chemin personnalisé soit inclus .... (pour une sortie complète, veuillez cliquer sur le lien ci-dessus et rechercher sqlite)

build/temp.linux-i686-2.7/home/jwxie518/Python-2.7.1/Modules/_sqlite/util.o -L/usr/lib -L/usr/local/lib -Wl, -R/usr/lib -lsqlite3 -o build/lib.linux-i686-2.7/_sqlite3.so

Je ne peux toujours pas importer sqlite3.

Merci!


Merci beaucoup, Michael Dillon, de m'avoir aidé. Votre tutoriel était net et clair.

J'ai résolu le problème dès que je me suis rendu compte que chaque fois que j'essayais Python-2.7.1, j'utilisais en fait celui installé par Pythonbrew.

La morale de l'histoire est lue toutes les erreurs. J'ai négligé les erreurs générées par l'importation de sqlite3. Celui installé par Pythonbrew n'avait pas installé sqlite3. Le package de développement pour sqlite3 a été installé après que Pythonbrew a installé Python-2.7.1

Merci.

30
CppLearner

Voici comment construire Python et corriger toutes les dépendances. Je suppose que vous voulez que cela Python soit entièrement séparé de la version Ubuntu Python, donc je suis spécifiant l'option --prefix pour tout installer dans/home/python27 en utilisant la disposition standard Python, c'est-à-dire site-packages au lieu de dist-packages.

1. Get the .tar.gz file into your own home directory.
2. tar zxvf Py*.tar.gz
3. cd Py*1
4. ./configure --prefix=/home/python27
5. make
6. make install

L'étape 5 est la plus importante. À la fin, il affichera une liste de tous les modules qui n'ont pas pu être construits correctement. Souvent, vous pouvez résoudre ce problème en installant un package Ubuntu et en réexécutant make.

a. Sudo apt-get install something-dev
b. make

Il est assez courant d'avoir un problème car il manque l'addon -dev à un module ou à un autre. Mais parfois, vous devez recommencer comme ceci:

a. make clean
b. ./configure --prefix=/home/python27
c. make

Recommencer ne fait jamais de mal si vous n'êtes pas sûr. Une note importante à propos de l'étape 6. Je n'utilise pas Sudo sur cette commande, ce qui signifie que vous devrez avoir le répertoire/home/python27 déjà créé avec la propriété appropriée.

N'hésitez pas à essayer ./configure --help |less avant de construire quelque chose car il peut y avoir des options intéressantes que vous pourriez utiliser. Une fois sur une distribution minimale, j'ai dû faire --with-dbmliborder = gdbm: bdb afin de faire fonctionner gdbm. Lorsque vous exécutez ./configure, les dernières lignes vous indiqueront où se trouvent les informations apprises. Dans le cas de Python, Modules/Setup a été utile pour comprendre comment obtenir un module à construire.

Une autre chose utile est de make clean puis exécutez make >make.out 2>&1 pour capturer toutes les sorties du processus de création complet. Ensuite, une fois terminé, utilisez less ou un éditeur pour rechercher les détails d'un module problématique tel que _sqlite. Par exemple, vérifiez toutes les options -I qui sont passées à gcc. Si le répertoire d'inclusion correct n'est pas dans la liste, cela pourrait provoquer un problème. Vous pouvez modifier setup.py pour modifier la liste des répertoires d'inclusion.

Dans le passé, il était plus courant d'avoir des problèmes de bibliothèque qui seraient résolus en se déconnectant, en se reconnectant et en exécutant "Sudo ldconfig" avant de procéder à une reconstruction complète.

43
Michael Dillon