2011-03-15 144 views
4

我試圖用pip安裝python軟件包時出現錯誤。pip沒有找到安裝文件

解開軟件包後,它在某個目錄中查找「setup.py」,並且在那裏找不到它。 setup.py文件實際上是一個目錄。

它在尋找:

'virtualenvs/pyling/build/nltk/setup.py' 

但它實際上是在:

virtualenvs/pyling $ ls build/nltk/nltk-2.0b9/ 
INSTALL.txt javasrc LICENSE.txt nltk PKG-INFO README.txt setup.py 

有沒有一種方法,使點子意識到在這個包嵌套文件夾結構?

感謝

+0

我假設你知道你可以解開它,並自己運行'python setup.py install'? – 2011-03-15 22:28:26

+1

是的,我知道這一點。只是我寧願使用pip,因爲我可以使用pip凍結需求文件以及製作一個包與其他人共享。 – dave 2011-03-16 17:01:54

回答

0

我增加了一個小功能,並調用它的屬性定義在PIP/req.py文件setup_py。

這似乎使它按我期望的方式工作,即如果setup.py文件只有一層更深。希望捆綁和凍結時,沒有得到破獲...

import os 

def get_setup_path(in_path): 
    print "starting path is %s"%in_path 
    fileList=os.listdir(in_path) 
    if fileList.__contains__("setup.py"): 
     print "setup.py is indeed there" 
     return in_path 
    for f in fileList: 
     f=os.path.join(in_path,f) 
     if os.path.isdir(f): 
      contents=os.listdir(f) 
      if contents.__contains__("setup.py"): 
       out_path=os.path.join(in_path,f) 
       return out_path 
    print "could not find setup.py by looking one level deeper" 
    return in_path 

,然後在這裏調用它req.py

(around line 195 in req.py) 
@property 
def setup_py(self): 
    self.source_dir= get_setup_path(self.source_dir) 
    return os.path.join(self.source_dir, 'setup.py') 
0
  • 修復包遵循標準的封裝佈局即setup.py應在頂層目錄中。

  • 解壓存檔和點pipsetup.py文件的目錄。
+0

我的解決方案允許我在下載任何東西之前先做一步安裝,這是我更喜歡的。凍結似乎仍然有效,但尚未捆綁,假設它也可以。 – dave 2011-03-17 14:07:03

0

我從一個setup.py是在不同的目錄中調用PIP的時候就已經有這個問題的解決方法是加入以下的setup.py:

進口OS os.chdir( os.path.dirname(os.path.abspath則(__file__)))

也許你打電話從virtualenvs PIP/pyling /編譯/ NLTK /它應該是virtualenvs/pyling /編譯/ NLTK/NLTK-2.0b9/?然後,只需添加我所做的。

+0

我希望能夠在我的目標虛擬環境中從任何目錄調用點子。該軟件包甚至沒有下載或解壓,但大部分時間沒有setup.py文件。 – dave 2011-03-17 14:05:50

+0

這可以通過執行以下命令來完成:source/path/to/your/virtualenv/bin/activate(每個打開的shell只需要一次)AND pip install/path/to/package OR/path/to/your/virtualenv/bin /點/路徑/到/包 – 2011-03-18 12:38:18

+0

是的,我已經在問題點激活。我看到你關於路徑的觀點,但是如果這個軟件包還沒有下載(哪個pip爲你做的),那麼目前還沒有可供參考的路徑。我想我想通過使用--download-only選項,然後安裝作爲第二步,在一步不是2。 – dave 2011-03-21 15:06:31

1

我發現的是,PIP運行一個python命令行腳本,看起來像這樣:

__file__ = '<path to package>/setup.py' 

from setuptools.command import egg_info 

def replacement_run(self): 
    self.mkpath(self.egg_info) 

    installer = self.distribution.fetch_build_egg 

    for ep in egg_info.iter_entry_points('egg_info.writers'): 
     # require=False is the change we're making: 

     writer = ep.load(require=False) 

     if writer: 
      writer(self, ep.name, egg_info.os.path.join(self.egg_info,ep.name)) 

    self.find_sources() 

egg_info.egg_info.run = replacement_run 

execfile(__file__) 

在包的頂級目錄,其中沒有setup.py,我把一個setup.py那轉載此行爲,但chdir'd包含「真正的」setup.py目錄,並在最後執行,而不是。

唯一的另一個問題是,pip創建了一個目錄「pip-egg-info」,它期望被填充,需要在「real」setup.py目錄中創建一個符號鏈接。

新的頂級設置。吡啶是這樣的:

#! /usr/bin/env python 

from os import chdir, symlink, getcwd 
from os.path import join, basename, exists 

filename = basename(__file__) 

chdir("python") 

setupdir = getcwd() 

egginfo = "pip-egg-info" 

if not exists(egginfo) and exists(join("..", egginfo)): 
    symlink(join("..", egginfo), egginfo) 

__file__ = join(setupdir, filename) 

from setuptools.command import egg_info 

def replacement_run(self): 
    self.mkpath(self.egg_info) 

    installer = self.distribution.fetch_build_egg 

    for ep in egg_info.iter_entry_points('egg_info.writers'): 
     # require=False is the change we're making: 

     writer = ep.load(require=False) 

     if writer: 
      writer(self, ep.name, egg_info.os.path.join(self.egg_info,ep.name)) 

    self.find_sources() 

egg_info.egg_info.run = replacement_run 

execfile(__file__) 

這也可能是脆弱的,但應該繼續工作,直到畫中畫改變,它的產生

0

我有類似的問題,放棄了對使用的默認網址,PIP在命令行Python代碼。但是,如果你只是想安裝nltk,這對我有用:

pip install -E <virtualenv-dir> PyYAML #if you have not done so 
pip install -E <virtualenv-dir> --no-index --find-links=http://nltk.googlecode.com/ nltk