我正在尝试创建一个可执行文件,可按如下方式执行:
./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)
任何以正确的命令格式获取可执行文件的帮助都将非常感谢!
答案 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,它试图猜测不同的扩展程序,如scriptname
或scriptname.exe
或scriptname.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.-系统范围的安装等。