簡體   English   中英

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

[英]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實現:

閱讀這些內容后,我將進行全新安裝,如下所示:

libgit2

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

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'

:)

在為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

安裝pygit

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM