【问题标题】:"No space left on device" when installing Numpy on an Azure Web Role在 Azure Web 角色上安装 Numpy 时“设备上没有剩余空间”
【发布时间】:2015-12-07 10:07:40
【问题描述】:

我想在 Microsoft Azure 上的 Python Web 角色中使用 Numpy 和 Pandas。

我尝试将numpypandas 添加到requirements.txt,但这不起作用(使用pip 安装numpy 经常会导致问题,所以这是意料之中的)。

I followed this advice 并从http://www.lfd.uci.edu/~gohlke/pythonlibs/ 下载 numpy 作为轮子并将文件放在 web 角色的根目录中。现在requirements.txt 看起来像这样:

azure>=0.8.0
azure-storage-logging
requests_futures
numpy-1.9.3+mkl-cp34-none-win32.whl
pandas

我远程进入虚拟机,发现C:\Resources\Directory\7044b9f2b424470aa191d9c178d06399.WorkerRole1.DiagnosticStore\LogFiles\ConfigureCloudService中有一些日志:

Storing debug log for failure in D:\Windows\system32\config\systemprofile\pip\pip.log
pip 1.5.6 from D:\Python34\lib\site-packages (python 3.4)
Unpacking e:\approot\numpy-1.9.3+mkl-cp34-none-win32.whl
Cleaning up...
Exception:
Traceback (most recent call last):
  File "D:\Python34\lib\site-packages\pip\basecommand.py", line 122, in main
    status = self.run(options, args)
  File "D:\Python34\lib\site-packages\pip\commands\install.py", line 278, in run
    requirement_set.prepare_files(finder, force_root_egg_info=self.bundle, bundle=self.bundle)
  File "D:\Python34\lib\site-packages\pip\req.py", line 1197, in prepare_files
    do_download,
  File "D:\Python34\lib\site-packages\pip\req.py", line 1364, in unpack_url
    unpack_file_url(link, location, download_dir)
  File "D:\Python34\lib\site-packages\pip\download.py", line 640, in unpack_file_url
    unpack_file(from_path, location, content_type, link)
  File "D:\Python34\lib\site-packages\pip\util.py", line 621, in unpack_file
    unzip_file(filename, location, flatten=not filename.endswith(('.pybundle', '.whl')))
  File "D:\Python34\lib\site-packages\pip\util.py", line 510, in unzip_file
    fp.write(data)
OSError: [Errno 28] No space left on device

Storing debug log for failure in D:\Windows\system32\config\systemprofile\pip\pip.log

如何让 Numpy 工作?

【问题讨论】:

  • 您的D: 驱动器空间不足
  • 很明显,但这是由 Microsoft Azure 管理的虚拟机。我尝试将我的计划从超小型升级到中型,但这似乎只会增加内存大小,而不是磁盘大小。
  • 你必须释放一些空间。尝试删除一些临时目录
  • 怎么会空间不足?我还不能执行任何代码,我唯一做的就是上传我的包,它由一些 python 代码和 numpy 轮组成。 Windows 资源管理器告诉我 D: 驱动器有 31.9 GB 中的 21.3 个可用空间。

标签: python azure numpy pip azure-web-roles


【解决方案1】:

根据您的描述,您似乎在 Azure 可以服务上托管您的 python 应用程序。如果你使用 Visual Studio 作为你的 IDE,我建议你可以按照这个解决方案:

您可以尝试在 Web Role 包中将 python 虚拟环境设置为 python 运行时,并利用 Visual Studio 我们可以轻松地在 python 中配置和部署云服务。

1、在您的Azure云服务项目解决方案中,右键单击您的Web角色包下的Python环境,单击添加虚拟环境

2,如果您将虚拟环境命名为env,VS 将在您的Web 角色根目录中创建一个名为env 的VE 文件夹。将wheel文件numpy-1.9.3+mkl-cp34-none-win32.whl复制到env文件夹中。

3、配置requirements.txt,完整配置pandasnumpy的依赖关系,这是我的requirements.txt旁边的azure包:

pandas
numpy-1.9.3+mkl-cp34-none-win32.whl
six
pytz

4、右击解决方案树中的虚拟环境,点击Install from requirements.txt,安装所有包。

5,然后将其部署到 Azure

通过我这边的这种方法可以正常工作。有任何问题,请随时告诉我。

【讨论】:

  • 这行得通!不过,我在设置解释器路径时遇到了一些问题。在构建项目时,会生成一个名为AzureSetup.cfg 的文件,其中变量interpreter_path 设置为%INTERPRETERPATH%。我发现无法设置此变量,或使其类似于%ROOTDIR%\env\Scripts\python.exe。我最后做的是编辑LaunchWorker.ps1,将$interpreter_path = read_value 'interpreter_path'这一行改为$interpreter_path = $($Env:RootDir) + '\env\Scripts\python.exe'
  • 我有一个更新:pypi 现在包含用于 windows 的轮子,所以你可以在 requirements.txt 中写 numpy 并且它会起作用,因为你在安装之前更新了 pip。您可以通过在 ConfigureCloudService.ps1 中添加一行来做到这一点:在 py -m pip install -r requirements.txt 之前写 py -m pip install -U pip
【解决方案2】:

在我的情况下,它是由驱动器 C: 太满引起的。您PC中所有进程的所有临时文件都存储在C盘中,因此您无法安装大包。

【讨论】:

    【解决方案3】:

    我已经解决了这个问题大约 3 天,在调试了 pip 代码和其他点点滴滴之后,我的修复是:

    iex "$env:PYPATH\Scripts\pip.exe install -b e:\approot\stuff -r requirements.txt"

    注意 -b。

    出于某种原因,Windows/Python 认为标准临时目录中的空间不足:c:\resources\app_id.....(当有 > 200GB 已满时)

    通过使用 -b 它会强制 pip 使用您自己的构建目录,该目录不会填满。

    很高兴

    【讨论】:

      【解决方案4】:

      我在安装 Numpy 时遇到了同样的问题。

      我从 article 获取的 Azure Web 角色的基本模板。 作为解决此错误的想法,我从Gordon's 答案中得到。

      我将 tmp 本地存储添加到我的 RoleProperties:

      之后,对 ServiceDefinition.csdef 中的启动任务进行了更改。为“tempdir”添加了一个变量:

      <Task executionContext="elevated" taskType="simple" commandLine="bin\ps.cmd 
      PipInstaller.ps1">
          <Environment>
            <Variable name="EMULATED">
              <RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated" />
            </Variable>
            <Variable name="TEMPDIR">
              <RoleInstanceValue xpath="/RoleEnvironment/CurrentInstance/LocalResources/LocalResource[@name='tempdir']/@path" />
            </Variable>
            <Variable name="PYTHON2" value="off" />
          </Environment>
        </Task>
      

      最后一步。更改“PipInstaller.ps1”以强制 pip 使用“tempdir”作为构建目录:

      $tmp_dir = $env:TEMPDIR
      py -m pip install -b $tmp_dir -r ..\requirements.txt
      

      【讨论】:

      • 自从我第一次问这个问题以来,很多事情都发生了变化。 Pip 现在已经为 Windows 上的 Numpy 和 Pandas 预先构建了轮子,所以你不需要自己包含它们,或者使用 virtualenv。
      猜你喜欢
      • 2017-04-06
      • 2017-09-20
      • 2020-09-26
      • 1970-01-01
      • 1970-01-01
      • 2012-12-29
      • 2012-01-14
      • 2012-05-15
      • 2018-11-22
      相关资源
      最近更新 更多