requirements.txt - 如何标记替代包

时间:2018-06-05 19:32:52

标签: python tensorflow pip

我正在编写一个依赖于tensorflow的项目,但可以通过两个pip包中的任意一个提供:tensorflowtensorflow-gpu。我的项目可以正常工作,但我不希望人们在没有gpu支持的机器上运行它来安装额外的开销,但我仍然希望在拥有gpu支持的机器上运行的人能够利用它。有没有办法在我的requirements.txt文件中标记我需要 tensorflow tensorflow-gpu,而不是两者都有?

修改

在这种特殊情况下,我应该注意到,从程序员的角度来看,tensorflowtensorflow-gpu都是相同的,因为它们都提供了一个模块tensorflow具有相同的功能/类/方法等,并且只有不同之处在于tensorflow-gpu受益于GPU加速。我遇到的问题是,如果我将tensorflow放在requirements.txt中,那么为了使用GPU加速运行,用户必须执行pip install -r requirements.txt && pip uninstall tensorflow && pip install tensorflow-gpu,这是不理想的,如果我改为将tensorflow-gpu放入requirements.txt,然后它将需要一堆不必要的系统库(CUDNN等),并且不会为非gpu用户提供开箱即用的功能。

再次编辑

作为解决方法,我决定提供两个不同的需求文件requirements.txtrequirements-gpu.txt,这两个文件都包含共享-r .requirements-core.txt并添加各自的版本张量流量这样,想要GPU支持的人可以pip install -r requirements-gpu.txt,但标准pip install -r requirements.txt仍然可以为所有人提供开箱即用的功能。

1 个答案:

答案 0 :(得分:4)

您无法使用requirements.txt来限制下载包,但您可以执行以下解决方案之一:

1 - 安装包tensorflow和tensorflow-gpu作为依赖项并尝试/除了选择实际使用的包,例如:

tensorflow = null

try:
  tensorflow = __import__("tensorflow-gpu")
  tensorflow.operation_that_requires_gpu()
except:
  tensorflow = __import__("tensorflow")
enter code here

2 - 在您的项目中,您要求客户直接将依赖关系传递给您:

def my_function_that_uses_tensorflow(tensorflow):
  # do stuff

from my_module import my_function_that_uses_tensorflow
import tensorflow # or tensorflow = __import__("tensorflow-gpu")
my_function_that_uses_tensorflow(tensorflow)

3 - 如果tensorflow-gpu和tensorflow都在你的网站包装上使用相同的tensorflow名称安装他们的包,那么我的建议是尝试/除了我在选项编号1上说的,但是不要&# 39; t包括tensorflow-gpu或tensorflow作为你的包的依赖(将它视为"对等依赖"使用你的包的代码应该作为它们的依赖包括以便使用它):

try:
  import tensorflow
except:
  raise ImportError('You need to include tensorflow or tensorflow-gpu as a dependency in order to use this package')