在Mac上用Python virtualenv安装pygit2 / libgit2

时间:2013-05-15 16:20:38

标签: python macos virtualenv libgit2 pygit2

我想我会失去理智。我想在我的macbook air上安装pygit2我的python virtualenv,这样我就可以开始工作了。然而,这并没有动摇,我一直在努力设置它。

我应该按照这些说明操作:

http://www.pygit2.org/install.html#how-to-install

我已经尝试了无数的东西,弄乱了rpath,因为显然在mac上这是以不同的方式实现的:

How to set the runtime path (-rpath) of an executable with gcc under Mac OSX?

......以及无数其他变体,我只是在猜测这一点,但每次我尝试构建pygit2时,总会导致这个结果:

(testenv)emil ~/sites/env/testenv/pygit2 > which python
/Users/emil/Sites/env/testenv/bin/python
(testenv)emil ~/sites/env/testenv/pygit2 > python -c 'import pygit2'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "pygit2/__init__.py", line 32, in <module>
    import _pygit2
ImportError: dlopen(/Users/emil/sites/env/testenv/lib/python2.7/site-packages/_pygit2.so, 2): Symbol not found: _git_remote_fetchspec
  Referenced from: /Users/emil/sites/env/testenv/lib/python2.7/site-packages/_pygit2.so
  Expected in: flat namespace
 in /Users/emil/sites/env/testenv/lib/python2.7/site-packages/_pygit2.so

它似乎没有正确链接库:

(testenv)emil ~/sites/env/testenv/pygit2 > nm /Users/emil/sites/env/testenv/lib/python2.7/site-packages/_pygit2.so | grep _git | less

000000000000626c T _Repository_git_object_lookup_prefix
0000000000011288 d _Repository_git_object_lookup_prefix__doc__
                 U _git_blob_create_frombuffer
                 U _git_blob_create_fromdisk
                 U _git_blob_create_fromworkdir
                 U _git_blob_rawsize
                 U _git_checkout_head
                 U _git_checkout_index
                 U _git_checkout_tree
                 U _git_commit_author
                 U _git_commit_committer
                 U _git_commit_create
                 U _git_commit_free
                 U _git_commit_lookup
                 U _git_commit_lookup_prefix
                 ...

当我尝试使用 pip 时,它说:

(testenv)emil ~/sites/env/testenv/pygit2 > pip install pygit2
Requirement already satisfied (use --upgrade to upgrade): pygit2 in /Users/emil/sites/env/testenv/lib/python2.7/site-packages
Cleaning up...
(testenv)emil ~/sites/env/testenv/pygit2 > pip install pygit2 --upgrade
Requirement already up-to-date: pygit2 in /Users/emil/sites/env/testenv/lib/python2.7/site-packages
Cleaning up...

如果有人在我感谢任何帮助之前已经做好了准备,否则我将使用它来记录问题并组织我的想法并希望记录解决方案。

4 个答案:

答案 0 :(得分:3)

pygit2网站上的说明似乎有点误导。它们的默认分支(master)绑定目标libgit2的master分支(即最新版本,此时为0.18.0),但libgit2的默认分支为development。网站上“最新”的含义不明确。

自上次发布以来,链接器找不到的函数已被删除,因此看起来您只是构建了错误的libgit2版本。使用libgit2的master分支或其v0.18.0标记,您应该没问题。

答案 1 :(得分:1)

我设法完成了这个设置,为了做到这一点,我必须阅读OSX的@rpath实现:

阅读完这些内容后,我进行了全新安装,如下所示:

libgit2

emil ~/Sites/env/testenv > export LIBGIT2=`pwd`
emil ~/Sites/env/testenv > git clone git://github.com/libgit2/libgit2.git -b v0.18.0

注意:请确保在使用pygit2时签出与当前-b v0.18.0版本兼容的代码。

(testenv)emil ~/sites/env/testenv/libgit2 > mkdir build && cd build
(testenv)emil ~/sites/env/testenv/libgit2/build > cmake .. -DCMAKE_INSTALL_PREFIX=$LIBGIT2
(testenv)emil ~/sites/env/testenv/libgit2/build > cmake --build . --target install

注意:如果您没有cmake将其与Homebrew一起安装,请brew install cmake

现在我们需要在libgit2库上设置安装名称,以便在rpath中找到它。

(testenv)emil ~/sites/env/testenv/lib > otool -D libgit2.0.18.0.dylib 
libgit2.0.18.0.dylib:
libgit2.0.dylib
(testenv)emil ~/sites/env/testenv/lib > install_name_tool -id "@rpath/libgit2.0.18.0.dylib" libgit2.0.18.0.dylib 
(testenv)emil ~/sites/env/testenv/lib > otool -D libgit2.0.18.0.dylib 
libgit2.0.18.0.dylib:
@rpath/libgit2.0.18.0.dylib

pygit2

(testenv)emil ~/sites/env/testenv > git clone git://github.com/libgit2/pygit2.git
(testenv)emil ~/sites/env/testenv > cd pygit2/
(testenv)emil ~/sites/env/testenv/pygit2 > python setup.py build

注意: OSX链接器没有pygit2教程中推荐的一些LDFLAGS,所以暂时不要使用它们,稍后会设置rpath

(testenv)emil ~/sites/env/testenv/pygit2 > python setup.py install

好的,现在你会收到这样的错误,因为在pygit2库上没有正确设置rpath

(testenv)emil ~/sites/env/testenv/pygit2 > python -c 'import pygit2'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "pygit2/__init__.py", line 32, in <module>
    import _pygit2
ImportError: dlopen(/Users/emil/sites/env/testenv/lib/python2.7/site-packages/_pygit2.so, 2): Library not loaded: @rpath/libgit2.0.18.0.dylib
  Referenced from: /Users/emil/sites/env/testenv/lib/python2.7/site-packages/_pygit2.so
  Reason: image not found

所以让我们设定它:

(testenv)emil ~/sites/env/testenv/pygit2 > cd /Users/emil/sites/env/testenv/lib/python2.7/site-packages/
(testenv)emil ~/sites/env/testenv/lib/python2.7/site-packages > install_name_tool -add_rpath "@loader_path/../../" _pygit2.so 

现在测试一下,如果没有输出,一切都很顺利:

(testenv)emil ~/sites/env/testenv/lib/python2.7/site-packages > python -c 'import pygit2'

:)

答案 2 :(得分:1)

在为saltstack安装libgit2和pygit2库时遇到了一个问题。原始安装遵循pygit2 doc上的说明,但在python 2.7.10下,它提升了“git_cert_hostkey”中“没有成员名为'parent'的错误”。

经过google搜索后,CarlosMartínNieto的话给了我一个提示,最后在OS X 10.11.4上安装了libgit2和pygit2。

  

使用自制软件安装libgit2,注意您安装的版本。

brew install libgit2

就我而言,安装了libgit2 0.23.4。

  

使用源代码构建pygit2。检查更改日志中与您安装的libgit2匹配的pygit2版本。在这里,我使用标记v0.23.3克隆源代码。

git clone https://github.com/libgit2/pygit2.git -b v0.23.3
cd pygit2
python setup.py build
python setup.py install

最后,你的mac上安装了libgit2和pygit2。希望这可能有所帮助。

答案 3 :(得分:0)

Emil Davtyan的回答帮助了我。我在Mac OS上,并尝试将python3与更高版本的libgit一起使用,因此必须将其修改为以下内容

brew install python3
libgit_version = '0.24.0'
mkvirutalenv --python=`which python3` py3libgit
workon py3libgit
cd $VIRTUAL_ENV
export LIBGIT2=`pwd`
git clone git://github.com/libgit2/libgit2.git -b "v${libgit_version}"
cd libgit2 &&  mkdir build && cd build
cmake --build . --target install
cd $LIBGIT2/lib
install_name_tool -id "@rpath/libgit2.${libgit_version}.dylib" libgit2.${libgit_version}.dylib
otool -D libgit2.${libgit_version}.dylib

安装pygit

pip install pygit2==0.24.0

注意,请确保python --versionPython 3.5.x提供Python 3.5.1的值。假设我们有3.5,则以下适用

cd $VIRTUAL_ENV/lib/python3.5/site-packages
install_name_tool -add_rpath "@loader_path/../../" _pygit2.cpython-35m-darwin.so
otool -L _pygit2.cpython-35m-darwin.so
python -c 'import pygit2'