1.3 /usr/bin/env python 有什么用? ================================== |image0| 我们经常会在别人的脚本或者项目的入口文件里看到第一行是下面这样 :: #!/usr/bin/python 或者这样 :: #!/usr/bin/env python 那么他们有什么用呢? 要理解它,得把这一行语句拆成两部分。 第一部分是 ``#!`` 第二部分是 ``/usr/bin/python`` 或者 ``/usr/bin/env python`` 关于 ``#!`` 这个符号,其实它是有名字的,叫做 ``Shebang`` 或者\ ``Sha-bang`` ,有的翻译组将它译作 ``释伴``\ ,即“解释伴随行”的简称,同时又是Shebang的音译。 Shebang通常出现在类Unix系统的脚本中第一行,作为前两个字符。在Shebang之后,可以有一个或数个空白字符,后接解释器的绝对路径,用于指明执行这个脚本文件的解释器。 |image1| **那么加和不加有什么区别呢?** 如果不加 ``#!`` 的话,你每次执行这个脚本时,都得这样 ``python xx.py`` , |image2| 有没有一种方式?可以省去每次都加 ``python`` 呢? 当然有,你可以文件头里加上\ ``#!/usr/bin/python`` ,那么当这个文件有可执行权限 时,只直接写这个脚本文件,就像下面这样。 |image3| 明白了这个后,再来看看 ``!/usr/bin/env python`` 这个 又是什么意思 ? 当我执行 ``env python`` 时,自动进入了 python console 的模式。 |image4| 这是为什么?和 直接执行 python 好像没什么区别呀 当你执行 ``env python`` 时,它其实会去 ``env | grep PATH`` 里(也就是 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin )这几个路径里去依次查找名为python的可执行文件。 找到一个就直接执行,上面我们的 python 路径是在 ``/usr/bin/python`` 里,在 ``PATH`` 列表里倒数第二个目录下,所以当我在 ``/usr/local/sbin`` 下创建一个名字也为 python 的可执行文件时,就会执行 ``/usr/bin/python`` 了。 具体演示过程,你可以看下面。 |image5| 那么对于这两者,我们应该使用哪个呢? 个人感觉应该优先使用 ``#!/usr/bin/env python``\ ,因为不是所有的机器的 python 解释器都是 ``/usr/bin/python`` 。 |image6| .. |image0| image:: http://image.iswbm.com/20200602135014.png .. |image1| image:: http://image.iswbm.com/20200331184021.png .. |image2| image:: http://image.iswbm.com/20200331185034.png .. |image3| image:: http://image.iswbm.com/20200331184755.png .. |image4| image:: http://image.iswbm.com/20200331185741.png .. |image5| image:: http://image.iswbm.com/20200331190224.png .. |image6| image:: http://image.iswbm.com/20200607174235.png