我想我会失去理智。我想在我的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...
如果有人在我感谢任何帮助之前已经做好了准备,否则我将使用它来记录问题并组织我的想法并希望记录解决方案。
答案 0 :(得分:3)
pygit2网站上的说明似乎有点误导。它们的默认分支(master
)绑定目标libgit2的master
分支(即最新版本,此时为0.18.0),但libgit2的默认分支为development
。网站上“最新”的含义不明确。
自上次发布以来,链接器找不到的函数已被删除,因此看起来您只是构建了错误的libgit2版本。使用libgit2的master
分支或其v0.18.0
标记,您应该没问题。
答案 1 :(得分:1)
我设法完成了这个设置,为了做到这一点,我必须阅读OSX的@rpath
实现:
阅读完这些内容后,我进行了全新安装,如下所示:
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
(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)
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
注意,请确保python --version
为Python 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'