2

我想我快要失去理智了。我试图pygit2在我的 macbook air 上简单地安装我的 python virtualenv,这样我就可以开始工作了。但是,这并没有改变,我整天都在尝试设置它。

我应该遵循以下说明:

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

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

如何在 Mac OSX 下使用 gcc 设置可执行文件的运行时路径(-rpath)?

...以及无数其他变体,我只是在这一点上猜测,但是每次我尝试构建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

4 回答 4

3

pygit2 网站上的说明似乎有点误导。他们的默认master分支masterdevelopment网站上“最新”的含义尚不清楚。

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

于 2013-05-16T08:15:56.797 回答
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

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

(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'

:)

于 2013-05-16T12:04:46.217 回答
1

我在为 saltstack 安装 libgit2 和 pygit2 库时遇到了一个问题。原始安装遵循pygit2 doc上的说明,但在 python 2.7.10 下,这会引发诸如“在 'git_cert_hostkey' 中没有名为 'parent' 的成员”之类的错误。

在google了很多之后,Carlos Martín Nieto的话给了我一个提示,终于在OS X 10.11.4上安装了libgit2和pygit2。

用 homebrew 安装 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。希望这可能会有所帮助。

于 2016-04-12T14:40:36.103 回答
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 --version给出的值为Python 3.5.xfor 例如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'
于 2016-04-03T18:31:15.757 回答