使用Makefile安装python requirements.txt,仅更改requirements.txt

使用Makefile安装python requirements.txt,仅更改requirements.txt,python,makefile,Python,Makefile,仅当requirements.txt发生更改时,如何运行targetmake install 我不想每次进行安装时都升级软件包 我通过创建伪文件\u requirements.txt.pyc找到了一些解决方法,但它是丑陋的和肮脏的。它将拒绝第二次安装pip需求,因为requirements.txt没有任何更改 $ make install-pip-requirements make: Nothing to be done for 'install-pip-requirements'. 但我的

仅当requirements.txt发生更改时,如何运行target
make install

我不想每次进行
安装时都升级软件包

我通过创建伪文件
\u requirements.txt.pyc
找到了一些解决方法,但它是丑陋的肮脏的。它将拒绝第二次安装pip需求,因为requirements.txt没有任何更改

$ make install-pip-requirements 
make: Nothing to be done for 'install-pip-requirements'.
但我的目标是:

# first time,
$ make install # create virtual environment, install requirements

# second time
$ make install # detected and skipping creating virtual env,
               # detect that requirements.txt have no changes 
               # and skipping installing again all python packages
make: Nothing to be done for 'install'.
Python包看起来像:

.
├── Makefile
├── README.rst
├── lambda_handler.py
└── requirements.txt
我正在使用文件,
Makefile
,实现python中的一些自动化:

/opt/virtual_env:
    # create virtual env if folder not exists
    python -m venv /opt/virtual_env

virtual: /opt/virtual_env

# if requirements.txt is modified than execute pip install
_requirements.txt.pyc: requirements.txt
    /opt/virtual_env/bin/pip install -r --upgrade requirements.txt
    echo > _requirements.txt.pyc

requirements: SOME MAGIG OR SOME make flags        
    pip install -r requirements.txt

install-pip-requirements: _requirements.txt.pyc

install: virtual requirements
我确信

一定是更好的办法


为此;)

目前还不确定它是否能回答您的问题。更好的方法是使用成熟的Python PIP项目模板

我们使用它来创建一个特定的pip包

它有一个Makefile,它不会不断地重新安装所有依赖项,并利用它,它允许在不同的python环境中自动运行项目测试。您仍然可以在dev virtualenv中进行开发,但我们仅在添加新包时更新它,其他一切都由tox处理

但是,到目前为止,您展示的是尝试从头开始编写Python构建,这是使用大量项目模板完成的。如果你真的想了解那里发生了什么,你可以分析


接下来:因为您希望它能够与makefile一起工作,所以我建议从pip命令中删除
--upgrade
标志。我怀疑您的需求不包括项目工作所需的版本。我们有一个经验,不把版本放在那里可能会严重阻碍事情的发展。因此,我们的
requirements.txt
如下所示:

configure==0.5
falcon==0.3.0
futures==3.0.5
gevent==1.1.1
greenlet==0.4.9
gunicorn==19.4.5
hiredis==0.2.0
python-mimeparse==1.5.2
PyYAML==3.11
redis==2.10.5
six==1.10.0
eventlet==0.18.4
在没有升级的情况下使用需求会导致pip简单地验证什么在virtualenv中,什么不在virtualenv中。满足所需版本的所有内容都将被跳过(无需下载)。您还可以在以下需求中引用git版本:

-e git+http://some-url-here/path-to/repository.git@branch-name-OR-commit-id#egg=package-name-how-to-appear-in-pip-freeze

@Danciuc,
make
只需要两个文件进行比较;您可以使用运行
pip install
的任何输出文件

例如,我通常使用一个“vendored”文件夹,因此我可以将路径别名为“vendored”文件夹,而不是使用虚拟文件

# Only run install if requirements.txt is newer than vendored folder
vendored-folder := vendored
.PHONY: install
install: $(vendored-folder)

$(vendored-folder): requirements.txt
    rm -rf $(vendored-folder)
    pip install -r requirements.txt -t $(vendored-folder)
如果您不使用供应商文件夹,下面的代码应该适用于virtualenv和全局设置

# Only run install if requirements.txt is newer than SITE_PACKAGES location
.PHONY: install
SITE_PACKAGES := $(shell pip show pip | grep '^Location' | cut -f2 -d':')
install: $(SITE_PACKAGES)

$(SITE_PACKAGES): requirements.txt
    pip install -r requirements.txt

您能更详细地解释一下python包的外观吗?您是否使用任何类型的python项目模板?为什么要运行make with
sudo
?更新了@ovanes,添加了文件夹树,删除了sudo,因为这与问题无关(假设我是root)。我不知道为什么,但我仍然认为这一定是一个更好的方法。我期待一个makefile解决方案:(@Andrei.Danciuc:ok,我提供了第二种选择,在
requirements.txt