当我加入我当前的公司时,我在他们的git仓库中看到了奇怪的文件。没有任何Python代码使用它。它仅仅是存在于项目的主目录下。我问我的同事,这个文件是用来干嘛的?他们告诉我——它让你的生活更轻松。这就是为什么今天我要写写这个文件 - Makefile。

目录:

makefile是什么,以及它的典型用途

具体到Python,你可以把什么放到makefile中

通过在Python项目中使用makefile,你可以获得什么好处

makefile是什么,以及它的典型用途

根据这个教程:

makefile是组织代码编译的一种简单方法。

通常情况下,它们用于编写C程序,来减轻代码可以作为程序使用前所需要做的所有东西。你可以指定规则,告诉make如何编译你的程序。用于C代码的简单的makefile如下:

helloword: helloword.c

gcc -o hellword hellword.c -I.

然后运行:

$ make helloword

用gcc来编译C。

这怎么跟Python扯在一起了?Python这门编程语言在调用的时候才编译,因此不需要任何makefile。正如我在开头所说的,在Python项目中,使用makefile,你可以让你的生活变得轻松,并且节省大量的按键操作。

具体到Python,你可以把什么放到makefile中

构建Python包后,你有没有想过清理你项目中的.pyc文件,或者消除伪迹?或者也许你想要运行覆盖率测试?使用pep8, lint或者isort?或许在docker容器中运行应用,最终写出那些对你的屏幕来说太长的命令?

这就是makefile的用武之地了。你可以将一切放在同一个地方,然后只使用make clean来清理不必要的文件,或者使用make tests来测试你的应用。

让我们先从我正在使用的makefile的一些例子开始:

HOST=127.0.0.1

TEST_PATH=./

clean-pyc:

find . -name '*.pyc' -exec rm --force {} +

find . -name '*.pyo' -exec rm --force {} +

find . -name '*~' -exec rm --force {} +

clean-build:

rm --force --recursive build/

rm --force --recursive dist/

rm --force --recursive *.egg-info

isort:

sh -c "isort --skip-glob=.tox --recursive . "

lint:

flake8 --exclude=.tox

test: clean-pyc

py.test --verbose --color=yes $(TEST_PATH)

run:

python manage.py runserver

docker-run:

docker build \

--file=./Dockerfile \

--tag=my_project ./

docker run \

--detach=false \

--name=my_project \

--publish=$(HOST):8080 \

my_project

开头,我为每一个命令添加了两个变量HOST和TEST_PATH,以便使用它们。规则clean-pyc查找所有以*.pyc, *.pyo或者*~结尾的文件,然后删除它们。命令尾部的+号是用于-exec command {},意味着命令的调用总数会比匹配的文件的数量要少得多。

下一个clean-build是用来提出构建伪迹。在isort中,shell根据何时的属性执行isort命令,-c标记用来从字符串而不是从标准输入读取命令。lint和run工作在相同的模式上。在test中,我添加了在实际的测试之前执行的额外的规则 - clean-pyc。最后的docker-run构建和运行docker。

你想要添加的额外的东西是一些称为PHONY的东西。默认情况下,makefile在文件上进行操作,因此,如果有个名为clean- pyc的文件,那么它会尝试使用它而不是使用命令。要避免这个,则在你的makefile文件开头使用PHONY:

.PHONY: clean-pyc clean-build

我还喜欢让我的makefile有帮助函数,因此我把这些放在里面的某些地方:

help:

@echo " clean-pyc"

@echo " Remove python artifacts."

@echo " clean-build"

@echo " Remove build artifacts."

@echo " isort"

@echo " Sort import statements."

@echo " lint"

@echo " Check style with flake8."

@echo " test"

@echo " Run py.test"

@echo ' run'

@echo ' Run the `my_project` service on your local machine.'

@echo ' docker-run'

@echo ' Build and run the `my_project` service in a Docker container.'

每个echo之前都有一个@,因为默认情况下,make载执行前把每一行都打印到控制台。At符号抑制这种行为,而当传递行给shell之前,@被丢弃。

但是,如果我想使用makefile,让我的应用程序运行在不同的主机和端口上呢?很简单,只需添加:

run:

python manage.py runserver --host $(HOST) --port $(PORT)

接着,你可以简单地运行:

$ make run HOST=127.0.0.1 PORT=8000

最后注意,makefile中的缩进必须使用TAB来完成,而不是空格。

通过在Python项目中使用makefile,你可以获得什么好处

正如你所见,在Python项目中使用makefile可以带来很多好东西。如果你已经厌倦了编写复杂的shell命令 —— 那么把它们放在makefile中的一个规则下。想要其他人很容易地运行对项目的测试吗?把pytest调用放在makefile中。创意是无止境的。

在你的项目中使用makefile吗?你觉得它有用,或者没用吗?你把什么其他的东西放在项目中呢?请把它写到评论中吧!

python编写makefile_Python项目中的Makefiles相关推荐

  1. 有关python的参考文献_测试开发论文,关于Python在嵌入式项目中的辅助开发相关参考文献资料-免费论文范文...

    导读:本文关于测试开发论文范文,可以做为相关论文参考文献,与写作提纲思路参考. 摘 要:嵌入式系统设计开发过程中常会遇到诸如算法分析.原型验证.自动化测试.辅助工具设计等工作,其开发效率和质量直接影响 ...

  2. python项目设计-Python:实际项目中抽象出的小项目设计

    Python: 一周笔记 本文根据实际项目中的一部分api 设计抽象出来,实例化成一个简单小例子,暂且叫作「学生管理系统」. 这个系统主要完成下面增删改查的功能: 包括: 学校信息的管理 教师信息的管 ...

  3. python的django项目中怎么添加app_django下如何创建多个app并设置urls

    1.创建第二个app 假设我们项目P下面已经有了一个默认的app,名字是app1.现在我想创建第二个app,名字时app2. 进入pychram下的Terminal中,运行命令:python mana ...

  4. java和python可以在一个项目中同时使用么-可以同时用python和java开发一个app吗?...

    java属于高大上,适合12306这种有钱的金主,同样的项目要是用java做的,就能唬来成倍的钱,没钱搞java,只能晚上加班到10来点,在eclipse吭哧吭哧地编译完项目以后,在七八屏的堆栈信息里 ...

  5. python编程django项目中ModuleNotFoundError: No module named ‘django.core.urlresolvers‘解决方法

    文章目录 遇到的问题 解决方法 参考 遇到的问题 在做<python编程-从入门到实践>书中的项目的时候,遇到No module named 'django.core.urlresolve ...

  6. python编写脚本方法_使用Python编写提取日志中的中文的脚本的方法

    由于工作需要在一大堆日志里面提取相应的一些固定字符,如果单纯靠手工取提取,数据量大,劳心劳力,于是自然而然想到了用Python做一个对应的提取工具,代替手工提取的繁杂,涉及中文字符,正则表达式不好匹配 ...

  7. java和python可以在一个项目中同时使用么-java调用python的几种用法(看这篇就够了)...

    java调用python的几种用法如下: 在java类中直接执行python语句 在java类中直接调用本地python脚本 使用Runtime.getRuntime()执行python脚本文件(推荐 ...

  8. 用python编写累加_python中累加怎么做

    Python中累加可以使用函数sum()来实现, 例: numpy.sum(A)---数组内所有元素之和,A---数组import numpy as np a = np.array([[1,3,6], ...

  9. Python:Django 项目中可用的各种装备和辅助

    1 Redis 数据库 2 MySQL 数据库 3 前端服务器 live-server 4 定时任务 django-crontab扩展 5 Docker 容器 --用来运行 FastDFS 分布式文件 ...

最新文章

  1. 9.spark core之共享变量
  2. java json.pasent_来自CSV的带有id parent(Python)的JSON树
  3. 五、Netty核心组件
  4. 【译】What do machine learning practitioners actually do?
  5. linux内核杂记(15)-系统调用(2)
  6. 计算机网络实验(华为eNSP模拟器)——第七章 远程终端协议(远程登陆)
  7. 在Java 里面怎么比较字符串
  8. oracle锁表怎么解决,Oracle锁表问题的简捷处理技巧
  9. C语言 Hello World - C语言零基础入门教程
  10. 用javascript实现动态增加DataGrid行
  11. leetcode python3 简单题108. Convert Sorted Array to Binary Search Tree
  12. python excel处理模块_Python(00):openpyxl模块处理Excel文件
  13. 语音识别从菜鸟到入门必看的参考书目
  14. [超详细] Apache网页优化:网页压缩与网页缓存超详细
  15. 每年春节被黄牛坑,只因你不了解这个技术!大数据反爬虫系统!
  16. 【Pix4d精品教程】Pix4DMapper 4.4.10/4.4.12/4.5.6经典手把手图文安装教程(附安装包下载)
  17. python3 scrapy中文文档_Python3爬虫入门:Scrapy 框架
  18. Zookeeper集群搭建(多节点,单机伪集群,Docker集群)
  19. 5.3 项目:超级秒表
  20. OpenStreetMap初探(一)——了解OpenStreetMap

热门文章

  1. 数据结构与算法之-----栈的应用(二)
  2. ueditor 上传路径 Php_v9切换ueditor后图片上传路径问题 改成绝对路径
  3. aptio2018设置u盘启动_华硕笔记本重装系统时,BIOS内无法设置u盘启动怎么办?
  4. Python+OpenCV:理解K-Means聚类(K-Means Clustering)
  5. 用于机器学习的Python和HDFS
  6. 基于 lumen 的微服务架构实践
  7. 如何迎接新的 .NET 时代
  8. Sonos拿1.3亿美金给员工发福利,中国厂商要拿什么拼?
  9. 大型网站性能优化途径
  10. linux系统中用户和组的管理