【问题标题】:When invoking a Python script, what is the difference between "./script.py" and "python script.py"调用 Python 脚本时,“./script.py”和“python script.py”有什么区别
【发布时间】:2012-04-07 06:03:24
【问题描述】:

一个区别是“./script.py”仅在 script.py 可执行(如文件权限)时才有效,但“python script.py”无论如何都有效。但是,我强烈怀疑还有更多差异,我想知道它们是什么。

我有一个 Django 网站,“python manage.py syncdb”工作得很好,但是“./manage.py syncdb”由于某种原因创建了一个损坏的数据库,这对我来说仍然是个谜。也许这与syncdb从命令行提示输入超级用户名和密码有关,并且可能使用“./manage.py syncdb”改变了它与命令行交互的方式,从而破坏了密码。可能是?我只是对这个错误感到困惑。 “python manage.py syncdb”完全修复了它,所以这只是好奇。

谢谢。

编辑:对对对,我忘了shebang行#!/usr/bin/python的必要性。但我刚刚检查过,“python manage.py syncdb”和“./manage.py syncdb”使用的是相同的 Python 解释器(Linux Mint 12 上唯一安装的 2.7.2)。然而前者有效,后者无效。

Python代码看到的环境变量会不会不一样?我的代码确实需要为每个 shell 设置特殊的 $LD_LOADER_PATH 和 $PYTHON_PATH。

【问题讨论】:

    标签: python django posix sh


    【解决方案1】:

    调用./script.py 使用脚本中的“shebang 行”来确定使用哪个解释器来运行脚本。这样的线可能看起来像

    #!/usr/bin/env python
    

    #!/usr/bin/python2.7
    

    或使用 python 解释器的任何路径。如果它解析为刚才调用的同一个 Python 解释器

    python
    

    从 shell 命令行来看,./script.pypython script.py 没有区别,但两个版本最终可能使用不同的 Python 解释器。

    【讨论】:

      【解决方案2】:

      ./script.py 运行文件开头#! 中定义的解释器。例如,第一行可能是#! /usr/bin/env python#! /usr/bin/python 或其他类似的东西。如果您查看调用的解释器,您可能能够解决该问题。

      【讨论】:

        【解决方案3】:

        ./script.py = "尝试在当前shell中执行一个名为script.py的文件"

        python script.py = "将script.py 作为参数发送到当前$PATH 中的第一个python 可执行文件"

        只有当文件为试图执行文件的用户设置了执行位时,第一个才有效并且它有所谓的shebang 行,它告诉 shell 如何运行它.

        【讨论】:

          【解决方案4】:

          在 Linux 中使用终端你可以执行任何文件 - 如果用户有执行权限 - 通过键入 ./fileName。当操作系统看到像#! /usr/bin/python(或perl 的#! /usr/bin/python)这样的有效标头时,它将调用python 或perl(适当的)解释器来执行程序。您可以直接使用命令python script.py,因为python 是位于环境变量$PATH 中/usr/bin(或其他地方)的可执行程序, 对应于可执行文件的目录。

          【讨论】:

            猜你喜欢
            • 2018-09-11
            • 2012-11-09
            • 2013-02-23
            • 2021-12-04
            • 1970-01-01
            • 1970-01-01
            • 2011-03-01
            • 1970-01-01
            • 2021-11-09
            相关资源
            最近更新 更多