使用./scriptName.py运行Python脚本

时间:2014-10-21 18:07:55

标签: python terminal

我正在尝试创建一个可执行文件,可按如下方式执行:

./scriptname arg1 arg2 arg3

如果我使用以下代码编译并运行:

python ./scriptname.py

如果我尝试使用所需的命令,我会收到一条错误说明:from:无法读取/ var / mail / sys

我的代码的开头如下:

#!/usr/bin/python

from sys import *

print 'Number of arguments:', len(sys.argv), 'arguments.'
print 'Argument List:', str(sys.argv)

任何以正确的命令格式获取可执行文件的帮助都将非常感谢!

1 个答案:

答案 0 :(得分:0)

使用shebang从脚本指定解释器时,#!必须字面上是文件中的前两个字节。

如果在#之前有换行符,空格,UTF-8 BOM,不可见字符等,那么它不是一个shebang行。如果您已将文件保存为UTF-16,那么文件以等效的ASCII字节#\0!\0开头,那么它不是一个shebang行。

如果没有shebang行,则脚本由您的默认shell运行。这意味着通过运行from sys import *命令来解释from行,如/usr/bin/from中所述,它将其第一个参数视为用户名,并查找用户{{1}的邮件假脱机,它不存在。并sys行通过运行import sys命令来解释,该命令不存在。

要查看文件的原始字节是什么,可以使用OS X内置的import命令。例如:

hexdump

第一个以运行python的shebang行开始(通过$ hexdump -n16 -C ./goodscript.py 00000000 23 21 2f 75 73 72 2f 62 69 6e 2f 65 6e 76 20 70 |#!/usr/bin/env p| $ hexdump -n16 -C ./badscript.py 00000000 00 23 21 2f 75 73 72 2f 62 69 6e 2f 65 6e 76 20 |.#!/usr/bin/env | 工具)。第二个字节以NUL字节开头(注意env而不是00 23 21 - 或者更简单地说,是23 21而不是右列中的.#!,所以它运行shell。


与此同时,如果您只是运行#!,那就是尝试运行名为./scriptname的程序,但没有扩展程序。 Unix不像Windows,它试图猜测不同的扩展程序,如scriptnamescriptname.exescriptname.bat,直到其中一个有效。

因此,如果您希望它可以scriptname.py运行,则必须重命名,硬链接,符号链接或将./scriptname复制到scriptname.py。从你最想要的东西(我猜)开始按降序排列:

  • scriptname 重命名文件。这意味着您根本不再拥有名为mv scriptname.py scriptname的文件,只有名为scriptname.py的文件。这是最简单的选择。但这确实意味着您现在必须编辑scriptname,而不是scriptname,依此类推,scriptname.py将有一个通用的Finder图标,依此类推。这也可能是一个问题,scriptname可用作其他Python脚本中scriptname.py的模块,以及可直接运行的脚本。但同样,如果这些都不是问题,那么这是最简单的选择。
  • import 符号链接该文件。这意味着ln -s scriptname.py scriptname现在是一个特殊的"链接文件"指着scriptname;当您键入scriptname.py时,OS X会将其有效地视为键入./scriptname的快捷方式。这意味着您仍然可以编辑(和./scriptname.py等)import,但可以将其作为scriptname.py运行。
  • ./scriptname hardlinks 该文件。 (注意这次缺少ln scriptname.py scriptname。)这意味着两个名称只是磁盘上同一文件的不同名称。这与前一个效果类似,但它不太明显,所以它可能不是你想要的。
  • -s 复制文件。这意味着,如果您稍后修改cp scriptname.py scriptname,则对scriptname.py不起作用,除非您重复复制(因为它们是完全独立的文件)。这几乎总是灾难的一个方法;有一天你会忘记副本,花了四个小时调试你已经修复过的你修复过的东西,因为修复程序没有进入你实际运行的脚本。

一个常见的事情是将其作为./scriptname保留在您的开发目录中,但是一旦您将其工作,请将其安装到PATH上scriptname.py的某个位置。例如,scriptname。然后,您不必(事实上,不能)将其作为install -m755 scriptname.py /usr/local/bin/scriptname运行,您只需将其作为./scriptname运行即可。但是,如果这是你想要的,你最好不要手动操作,而是学习如何构建Python分发包并编写一个在每个平台上做正确事情的scriptname,处理用户-vs.-系统范围的安装等。