一个区别是“./script.py”仅在script.py可执行时有效(如在文件权限中),但“python script.py”无论如何都有效。但是,我强烈怀疑存在更多差异,我想知道它们是什么。
我有一个Django网站,“python manage.py syncdb”工作正常,但“./manage.py syncdb”因某些原因创建了一个损坏的数据库,这对我来说仍然是一个谜。也许这与syncdb从命令行提示输入超级用户名和密码的事实有关,并且可能使用“./manage.py syncdb”更改它与命令行交互的方式,从而破坏了密码。也许?我对此错误感到困惑。 “python manage.py syncdb”完全修复它,所以这只是好奇心。
感谢。
编辑:对,对,我忘记了shebang line#!/ usr / bin / python的必要性。但我刚刚检查过,“python manage.py syncdb”和“./manage.py syncdb”正在使用相同的Python解释器(2.7.2,在Linux Mint 12上安装的唯一一个)。然而前者是后者而后者则不是。
Python代码看到的环境变量是否会有所不同?我的代码确实需要为每个shell设置$ LD_LOADER_PATH和$ PYTHON_PATH。
答案 0 :(得分:6)
调用./script.py
使用脚本中的“shebang line”来确定用于运行脚本的解释器。这样的一行可能看起来像
#!/usr/bin/env python
或
#!/usr/bin/python2.7
或使用python解释器的任何路径。如果它解析为仅由
调用的相同Python解释器python
从shell命令行,./script.py
和python script.py
之间没有区别,但是这两个版本最终可能会使用不同的Python解释器。
答案 1 :(得分:1)
./script.py
=“尝试在当前shell中执行名为script.py
的文件”
python script.py
=“将script.py
作为参数发送到当前python
中的第一个$PATH
可执行文件”
第一个只有在文件为试图执行文件的用户设置了执行位且它有所谓的shebang行时才有效,它告诉shell如何跑吧。
答案 2 :(得分:0)
./ script.py运行在文件开头的#!
中定义的解释器。例如,第一行可能是#! /usr/bin/env python
或#! /usr/bin/python
或类似的其他内容。如果您查看调用的解释器,您可能能够解决该问题。
答案 3 :(得分:0)
在使用终端的Linux中,您可以通过键入来执行任何文件 - 如果用户具有执行权限
./fileName
。当操作系统看到有效的标头如#! /usr/bin/python
(或perl #! /usr/bin/python
)时,它将调用python或perl(适当的)解释器来执行程序。您可以直接使用命令python script.py
,因为python
是位于/usr/bin
(或其他地方)的可执行程序,它位于环境变量$ PATH中,
对应于可执行文件目录。