【问题标题】:Building Python and more on missing modules在缺少的模块上构建 Python 等
【发布时间】:2011-09-04 11:59:39
【问题描述】:

我有另一个线程寻求有关“缺少 zlib”的帮助。在很好的帮助下,问题已经(几乎)解决了。

现在我有兴趣自己构建 Python(在 Ubuntu 10.10 上)。

几个重要的问题引起了我的注意:

  1. 构建 Python(比如 2.7.1)后,如果缺少模块,是否需要重新构建 Python?

  2. 有没有办法在构建 Python 之前找出哪些模块会丢失?说sqlite3。我为系统默认(Python 2.6.6)安装了 sqlite3,我可以将其导入 Python 2.6.6 shell。现在我使用 pythonbrew 构建 2.7.1,在 shell 中我无法导入 sqlite3,因为 _sqlite3 不可用。我确信还有一些更重要的缺失是我未来开发所需要的(例如 Django ..)。

我愿意学习如何在不使用pythonbrew 的情况下进行构建。

请与我分享您构建另一个版本的 Python 的经验,您将如何解决缺少模块的问题?是否有构建 Python 的实用解决方案?

我从来没有费心自己建造一个,所以请多多包涵。我开始意识到自己学习和建立自己的重要性!非常感谢!


编辑

首先,我感谢您的所有意见。他们意义重大。我做了建筑。

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.

我得到了 sqlite3 和 readline 离开了

sudo apt-get install libreadline6 libreadline6-dev
sudo apt-get install libsqlite3-dev

我尝试导入它们,但仍然“没有命名模块 xxxx”。

AskUbuntu,我实际上询问了人们如何获取以前的命令,因为当我在 Python 2.7.1 shell 中时无法使用该功能。我相信这是由于readline。 Readline

我在这个目录下安装了Python-2.7.1:/home/jwxie518/python27/

我查看了 setup.py,发现了以下几行:

# 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',
                   ]

上面列出的所有路径都不存在。 所以我想我必须手动安装 sqlite3?我得到了另一个参考here(不过是中文的)

# 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

我进入了安装 sqlite3 的目录。我只找到了 include/sqlite3.h。所以我回去检查/usr/include/。我也只能找到 sqlite3.h。

那么这里发生了什么? Readline 也是不可导入的。


第三次编辑 我重新开始一切,除了我没有重新安装 sqlite3。

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

make.out 在这里:http://pastebin.com/raw.php?i=7k3BfxZQ

我仍然无法导入 sqlite3。所以我进入 setup.py 并进行了更改:

# 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',
                   ]

再一次,把所有东西都跑一遍(这次我也做了 ma​​ke clean

输出在这里:http://pastebin.com/raw.php?i=8ZKgAcWn

根据输出,我认为没有包含自定义路径....(完整输出请到上面的链接搜索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

我仍然无法导入 sqlite3。

谢谢!


非常感谢 Michael Dillon 帮助我。您的教程简洁明了。

当我意识到每当我尝试 Python-2.7.1 时,我就解决了这个问题,我实际上使用的是 Pythonbrew 安装的那个。

故事的寓意是阅读所有错误。我忽略了导入 sqlite3 产生的错误。 Pythonbrew 安装的那个没有安装 sqlite3。在 Pythonbrew 安装 Python-2.7.1 之后安装 sqlite3 的开发包

​​>

谢谢。

【问题讨论】:

    标签: python ubuntu


    【解决方案1】:

    这是构建 Python 和修复任何依赖项的方法。我假设您希望此 Python 与 Ubuntu 版本 Python 完全分离,因此我指定 --prefix 选项以使用标准 Python 布局将其全部安装在 /home/python27 中,即 site-packages 而不是 dist-包。

    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
    

    第 5 步是重要的一步。最后,它将显示无法正确构建的所有模块的列表。通常,您可以通过安装 Ubuntu 软件包并重新运行 make 来解决此问题。

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

    出现问题是很常见的,因为您缺少某些模块或其他模块的 -dev 插件。但有时你应该这样重新开始:

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

    如果您不确定,重新开始永远不会受到伤害。关于第 6 步的重要说明。我没有在此命令上使用 sudo,这意味着您需要已创建具有适当所有权的 /home/python27 目录。

    在构建之前不要犹豫尝试./configure --help |less,因为您可能会使用一些有趣的选项。有一次,在一个最小的发行版上,我必须 --with-dbmliborder=gdbm:bdb 才能让 gdbm 工作。当你运行 ./configure 时,最后几行会告诉你它把学到的信息放在哪里。对于 Python,Modules/Setup 有助于弄清楚如何构建模块。

    另一个有用的事情是make clean 然后运行make >make.out 2>&1 以捕获完整制作过程的所有输出。然后,完成后,使用less 或编辑器查找有关问题模块的详细信息,例如_sqlite。例如,检查传递给gcc 的所有-I 选项。如果正确的包含目录不在会导致问题的列表中。您可以编辑setup.py 以更改包含目录的列表。

    在过去,更常见的库问题可以通过注销、再次登录并在完全重建之前运行“sudo ldconfig”来解决。

    【讨论】:

    • @Michael Dillon 感谢您的帮助。我按照您的指南进行操作,但无法正确导入。我编辑了我的帖子。请查看编辑部分。谢谢!
    • 在您的编辑中,您没有说您在运行 apt-get 后再次运行了 make 命令。你又运行 make 了吗?
    • @Michael Dillon 是的。我做到了。在第二次编辑之前。我做了所有必要的步骤。安装 sqlite3 后,我还重建了 python
    • @Michael Dillon 感谢您的帮助!我编辑了帖子(第三次编辑)。即使在编辑 setup.py 之后,我也不认为 sqlite 包含在路径中。谢谢。
    • 我不明白你说“我也只能找到 sqlite3.h”的语法。如果 sqlite3.h 在 /usr/include 中,则 setup.py 已正确配置,当您查看 make.out 时应该会看到它已成功构建。该问题可能会显示在 make.out 的输出中,它会尝试构建 sqlite 模块。
    猜你喜欢
    • 1970-01-01
    • 2014-12-27
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    • 2015-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多