2012-07-19 20 views
18

我創建了一個環境,並通過添加的git包的Django paramfield:皮普凍結不顯示要求的版本庫路徑文件

$ pip install git+https://bitbucket.org/DataGreed/django-paramfield.git 
Downloading/unpacking git+https://bitbucket.org/DataGreed/django-paramfield.git 
    Cloning https://bitbucket.org/DataGreed/django-paramfield.git to /var/folders/9Z/9ZQZ1Q3WGMOW+JguzcBKNU+++TI/-Tmp-/pip-49Eokm-build 
Unpacking objects: 100% (29/29), done. 
    Running setup.py egg_info for package from git+https://bitbucket.org/DataGreed/django-paramfield.git 
Installing collected packages: paramfield 
    Running setup.py install for paramfield 
Successfully installed paramfield 
Cleaning up... 

但是,當我想創建一個需求文件,我只有看到包名稱:

$ pip freeze 
paramfield==0.1 
wsgiref==0.1.2 

我怎樣才能使輸出整串git+https://bitbucket.org/DataGreed/django-paramfield.git,而不是僅僅一個包的名字嗎?該軟件包不在PyPi中。

UPD:也許它必須用setup.py做點什麼?我應該改變它以反映回購網址嗎?

UPD2:我發現相當的計算器類似question,但作者不知道他是怎麼設法解決問題和接受的答案沒有給出一個很好的提示遺憾的是,雖然從作者的評論判斷它與setup.py文件有關。

UPD3:我試過在setup.py中通過download_url,並通過pip安裝這個包,但問題依然存在。

+0

聽起來好像這是PIP或錯誤的文檔中的疏忽。告訴他們https://github.com/pypa/pip/issues – 2012-07-24 09:53:46

+0

謝謝,我已經提交了一個問題 - https://github.com/pypa/pip/issues/609 – DataGreed 2012-07-24 13:27:13

回答

17

一個簡單但工作的解決方法是與-e標誌像pip install -e git+https://bitbucket.org/DataGreed/django-paramfield.git#egg=django-paramfield安裝軟件包。

然後pip freeze顯示包的完整源代碼路徑。這不是最好的方式,它應該在點中修復,但它的工作。權衡-e(編輯標誌)是指pip將git/hg repo克隆到/path/to/venv/src/packagename並運行python setup.py deploy,而不是將其克隆到臨時目錄並運行python setup.py install,並在安裝包後刪除臨時目錄。

+0

謝謝,這真的是一種可能的解決方法,但我相信這是正確的語法是pip install -e git + https://bitbucket.org/DataGreed /django-paramfield.git#egg=paramfield - 但是-e標誌究竟是幹什麼的?指定一個目錄來安裝軟件包? – DataGreed 2012-07-24 13:24:48

3

這裏有一個腳本,將做到這一點:

#!/usr/bin/env python 

from subprocess import check_output 
from pkg_resources import get_distribution 

def download_url(package): 
    dist = get_distribution(package) 
    for line in dist._get_metadata('PKG-INFO'): 
     if line.startswith('Download-URL:'): 
      return line.split(':', 1)[1] 


def main(argv=None): 
    import sys 
    from argparse import ArgumentParser 

    argv = argv or sys.argv 

    parser = ArgumentParser(
     description='show download urls for installed packages') 
    parser.parse_args(argv[1:]) 

    for package in check_output(['pip', 'freeze']).splitlines(): 
     print('{}: {}'.format(package, download_url(package) or 'UNKNOWN')) 


if __name__ == '__main__': 
    main() 
+0

但爲什麼pip freeze不能這樣做?通常它顯示回購網站 – DataGreed 2012-07-24 08:55:00

+0

應該有一個更簡單的方法來做到這一點清楚 – DataGreed 2012-07-24 08:57:08

1

這是一個老問題,但我通過這個同樣的問題和解決 工作只需將路徑添加到回購(在我的情況GIT)的要求外商投資企業,而不是包名

... 
celery==3.0.19 
# chunkdata isn't available on PyPi 
https://github.com/aaronmccall/chunkdata/zipball/master 
distribute==0.6.34 
... 

工作就像一個魅力deplying在Heroku

+0

當然,它基本上與接受的答案相同 - pip凍結會生成類似的行;) – DataGreed 2013-07-22 06:45:14

+0

或'git + https:// github.com/aaronmccall/chunkdata.git' – Rockallite 2014-06-01 02:30:10