在Mac上的Python virtualenv中安装pygit2/libgit2

在Mac上的Python virtualenv中安装pygit2/libgit2,python,macos,virtualenv,libgit2,pygit2,Python,Macos,Virtualenv,Libgit2,Pygit2,我想我快要失去理智了。我正试图在MacBookAir上的python virtualenv中简单地安装pygit2,这样我就可以开始工作了。然而,这并没有改变,我已经尝试了一整天 我应该遵循以下说明: 我已经尝试了无数的事情,在rpath上乱搞,因为显然在Mac上实现的方式不同: 。。。在这一点上,我只是猜测,还有无数的其他变体,但是每次我尝试构建pygit2时,总是会导致这样的结果: (testenv)emil ~/sites/env/testenv/pygit2 > which p

我想我快要失去理智了。我正试图在MacBookAir上的python virtualenv中简单地安装
pygit2
,这样我就可以开始工作了。然而,这并没有改变,我已经尝试了一整天

我应该遵循以下说明:

我已经尝试了无数的事情,在
rpath
上乱搞,因为显然在Mac上实现的方式不同:

。。。在这一点上,我只是猜测,还有无数的其他变体,但是每次我尝试构建
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
当我尝试使用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...

如果有人在我之前设置了这个,我将非常感谢任何帮助,否则我将用它来记录问题,整理我的想法,并希望记录解决方案。

pygit2网站上的说明似乎有点误导。它们的默认分支(
master
)绑定libgit2的
master
分支(即最新版本,目前为0.18.0),但libgit2的默认分支是
开发
。网站上“最新”的含义不清楚


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

我成功地建立了这个设置,为了做到这一点,我必须阅读OSX对
@rpath
的实现:

读了这些之后,我进行了一次干净的安装,如下所示:

libgit2 注意:确保签出与当前
pygit2
版本兼容的标签,此时您可以使用
-bv0.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
使用自制软件安装,请使用
brew安装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 注意:OSX链接器没有pygit2教程中推荐的一些LDFlag,因此现在跳过使用它们,稍后将设置
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/lib/python2.7/site-packages > python -c 'import pygit2'

:)

埃米尔·达夫坦的回答对我有帮助。我当时在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 注意,请确保
python--version
为例如
python3.5.1
提供的值为
python3.5.x
。假设我们有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'

我在为saltstack安装libgit2和pygit2库时遇到了一个问题。最初的安装是按照python 2.7.10上的说明进行的,但是在python 2.7.10下,出现了诸如“git_cert_hostkey中没有名为'parent'的成员”之类的错误

在谷歌搜索了很多之后,卡洛斯·马丁涅托的话给了我一个提示,最终在OS X 10.11.4上安装了libgit2和pygit2

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

在我的例子中,安装了libgit20.23.4

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


最后,libgit2和pygit2安装在mac上。希望这能有所帮助。

我成功地安装了它,这是问题的一部分,但总体问题来自于在macintosh上正确设置
rpath
。我将发布一点完整的说明给其他可能遇到类似情况的人。
(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'
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
pip install pygit2==0.24.0
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'
brew install libgit2
git clone https://github.com/libgit2/pygit2.git -b v0.23.3
cd pygit2
python setup.py build
python setup.py install