[英]Installing pygit2/libgit2 in Python virtualenv on a Mac
我想我會失去理智。 我試圖在MacBook Air上的python virtualenv中簡單地安裝pygit2
,這樣我就可以開始工作了。 但是,這並不是在萌芽,我一直試圖整天設置它。
我應該遵循以下指示:
http://www.pygit2.org/install.html#how-to-install
我嘗試了無數次的事情,弄亂了rpath
因為顯然在macs上這是不同的實現方式:
如何在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...
如果有人在我不希望得到任何幫助之前進行了設置,否則我將使用它來記錄問題並整理想法,並希望記錄解決方案。
pygit2網站上的說明似乎有些誤導。 他們的默認分支( master
)綁定了目標libgit2的master
分支(即最新版本,目前為0.18.0),但是libgit2的默認分支是development
。 網站上“最新”的含義不明確。
自上一發行版以來,鏈接器找不到的功能已被刪除,因此看起來您只是在針對錯誤的libgit2版本構建。 使用libgit2的master
分支或其v0.18.0
標記,您應該可以。
我設法進行了設置,為了做到這一點,我不得不閱讀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
注意:確保您可以使用-b v0.18.0
簽出與當前pygit2
版本兼容的標記。
(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
,則使用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'
:)
在為saltstack安裝libgit2和pygit2庫時遇到一個問題。 原始安裝遵循pygit2 doc上的說明,但是在python 2.7.10下,它引起了諸如“在'git_cert_hostkey'中沒有名為'parent'的成員”之類的錯誤。
經過大量搜索之后,CarlosMartínNieto的話給了我一個提示,最終在OS X 10.11.4上安裝了libgit2和pygit2。
用自制軟件安裝libgit2,注意安裝的版本。
brew install libgit2
就我而言,已安裝libgit2 0.23.4。
使用源代碼構建pygit2。 檢查changelog中與您安裝的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。 希望這會有所幫助。
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
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'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.