【问题标题】:How to use virtualenv in makefile如何在 makefile 中使用 virtualenv
【发布时间】:2014-09-04 08:19:12
【问题描述】:

我想在指定的 virtualenv 上执行几个操作。

例如命令

make install

相当于

source path/to/virtualenv/bin/activate
pip install -r requirements.txt

有可能吗?

【问题讨论】:

    标签: makefile virtualenv


    【解决方案1】:

    在 make 中,您可以将 shell 作为命令运行。在这个 shell 中,您可以在从命令行开始的 shell 中做所有可以做的事情。示例:

    install:
        ( \
           source path/to/virtualenv/bin/activate; \
           pip install -r requirements.txt; \
        )
    

    注意;\

    左大括号和右大括号之间的所有内容都将在一个 shell 实例中完成。

    【讨论】:

    • 在这种情况下不需要()。 make 已经为规则正文中的每一行生成了一个新的 shell 实例。您只需要使用继续标记来读取行并在单个 shell 中执行它们,而不是像默认情况下那样在多个 shell 中执行。
    • @Yukulélé:请不要更改我的回答,这里也作为解决方案发布。 user2693845 准确地发布了您编辑我的答案的内容。 Etan 的评论已经解释说不需要大括号...
    • 我得到“源:找不到命令”,所以我最终不得不使用同义词。 Ex 更改上述 3:`.路径/到/virtualenv/bin/激活; ` 我希望这可以帮助其他在这里绊倒的人:-)
    【解决方案2】:

    您也可以使用名为“VIRTUALENVWRAPPER_SCRIPT”的环境变量。像这样:

    install:
        ( \
           source $$VIRTUALENVWRAPPER_SCRIPT; \
           pip install -r requirements.txt; \
        )
    

    【讨论】:

      【解决方案3】:

      我很幸运。

      install:
          source ./path/to/bin/activate; \
          pip install -r requirements.txt; \
      

      【讨论】:

      • /bin/sh: 1: 来源:未找到
      • @Adil 例如,将此添加到 makefile 的第一行:SHELL := /bin/bash。调整到您使用的任何外壳。
      • @Adil,或使用 POSIX 点命令代替source,如. ./path/to/bin/activate
      【解决方案4】:

      你应该使用它,它现在对我有用。

      report.ipynb : merged.ipynb
          ( bash -c "source ${HOME}/anaconda3/bin/activate py27; which -a python; \
              jupyter nbconvert \
              --to notebook \
              --ExecutePreprocessor.kernel_name=python2 \
              --ExecutePreprocessor.timeout=3000 \
              --execute merged.ipynb \
              --output=$< $<" )
      

      【讨论】:

        【解决方案5】:

        我喜欢使用仅在 requirements.txt 更改时运行的东西:

        这假定源文件位于项目根目录中的project 下,并且测试位于project/test 下。 (您应该更改 project 以匹配您的实际项目名称。)

        venv: venv/touchfile
        
        venv/touchfile: requirements.txt
            test -d venv || virtualenv venv
            . venv/bin/activate; pip install -Ur requirements.txt
            touch venv/touchfile
        
        test: venv
            . venv/bin/activate; nosetests project/test
        
        clean:
            rm -rf venv
            find -iname "*.pyc" -delete
        
        • 运行makerequirements.txt 中安装软件包。
        • 运行make test 运行您的测试(如果您的测试在其他地方,您可以更新此命令)。
        • 运行 make clean 删除所有工件。

        【讨论】:

        • 这看起来很漂亮。谁能详细解释一下?
        • 您还需要哪些其他信息?我可以补充答案。
        • @oneself 应该运行什么来激活什么
        • 如果 pip 安装失败,这将删除 venv/bin/activate。最好使用另一个“跟踪文件”。只需将所有出现(当然,除了采购之外)更改为 venv/bin/updated_by_make
        • @zean_7 只需输入make 即可执行makefile 中的第一个目标,在本例中为venv。由于venv 依赖于venv/touchfile,因此该配方也会运行,前提是requirements.txt(其依赖项)已更改。 venv/touchfile 只是一个空文件,用于跟踪虚拟环境的修改时间。
        【解决方案6】:

        通常make 在不同的子shell 中运行配方中的每个命令。但是,设置.ONESHELL: 将在同一个子shell 中运行一个配方中的所有命令,允许您激活一个virtualenv,然后在其中运行命令。

        请注意,.ONESHELL: 适用于整个 Makefile,而不仅仅是单个配方。它可能会改变现有命令的行为,以及完整文档中可能出现的错误的详细信息。这不会让您激活一个在 Makefile 之外使用的 virtualenv,因为这些命令仍然在子 shell 中运行。

        参考文档:https://www.gnu.org/software/make/manual/html_node/One-Shell.html

        例子:

        .ONESHELL:
        
        .PHONY: install
        install:
            source path/to/virtualenv/bin/activate
            pip install -r requirements.txt
        

        【讨论】:

        • 我认为这是最好的解决方案
        【解决方案7】:

        这是运行您想在 virtualenv 中运行的东西的另一种方法。

        BIN=venv/bin/
        
        install:
            $(BIN)pip install -r requirements.txt
        
        run:
            $(BIN)python main.py
        

        PS:这不会激活 virtualenv,但可以完成任务。希望你觉得它干净实用。

        【讨论】:

          【解决方案8】:

          根据上面的答案(感谢@Saurabh 和@oneself!),我编写了一个可重用的 Makefile,负责创建虚拟环境并保持更新:https://github.com/sio/Makefile.venv

          它通过在 virtualenv 中引用正确的可执行文件来工作,并且不依赖于“激活”shell 脚本。这是一个例子:

          test: venv
              $(VENV)/python -m unittest
          
          include Makefile.venv
          

          考虑到 Windows 和其他操作系统之间的差异,Makefile.venv 应该可以在任何提供 Python 和 make 的操作系统上正常工作。

          【讨论】:

            猜你喜欢
            • 2018-10-28
            • 2014-11-22
            • 2016-02-23
            • 2017-07-28
            • 2016-02-29
            • 2019-10-03
            • 2012-10-26
            • 2018-10-27
            相关资源
            最近更新 更多