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

使用./scriptName.py运行Python脚本,python,terminal,Python,Terminal,我正在尝试创建一个可执行文件,该文件可以按如下方式执行: ./scriptname arg1 arg2 arg3 #!/usr/bin/python from sys import * print 'Number of arguments:', len(sys.argv), 'arguments.' print 'Argument List:', str(sys.argv) 如果我使用以下命令,代码将编译并运行: python ./scriptname.py 如果尝试使用所需的命令,则

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

./scriptname arg1 arg2 arg3
#!/usr/bin/python

from sys import *

print 'Number of arguments:', len(sys.argv), 'arguments.'
print 'Argument List:', str(sys.argv)
如果我使用以下命令,代码将编译并运行:

python ./scriptname.py
如果尝试使用所需的命令,则会出现一个错误,说明:from:cannotread/var/mail/sys

我的代码开头如下:

./scriptname arg1 arg2 arg3
#!/usr/bin/python

from sys import *

print 'Number of arguments:', len(sys.argv), 'arguments.'
print 'Argument List:', str(sys.argv)
如果您能帮助我以正确的命令格式获取可执行文件,我们将不胜感激

使用指定脚本中的解释器时!必须是文件中的前两个字节

如果在前面有换行符、空格、UTF-8 BOM表、不可见字符等,则它不是shebang行。如果您已将该文件保存为UTF-16,则该文件以等效的ASCII字节开始\0\0,这不是一条蛇帮线

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

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

$ 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 |
第一个是从一个shebang行开始的,该行通过env工具运行python。第二个以NUL字节开始,注意00 23 21,而不是23 21,或者更简单地说,是。!而不是在右边的列中,因此它运行shell

同时,如果您只运行./scriptname,这实际上是试图运行一个名为scriptname的程序,没有扩展名。Unix与Windows不同,它尝试猜测不同的扩展名,如scriptname.exe、scriptname.bat或scriptname.py,直到其中一个工作

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

mv scriptname.py scriptname重命名文件。这意味着您不再有名为scriptname.py的文件,只有名为scriptname的文件。这是最简单的选择。但这确实意味着您现在必须编辑scriptname,而不是scriptname.py等等,scriptname将有一个通用的查找器图标等等。这也可能是一个问题,因为scriptname.py可用作在其他Python脚本中导入的模块,以及直接运行的脚本。但是,如果这些都不是问题,那么这是最简单的选择。 ln-s scriptname.py scriptname符号链接文件。这意味着scriptname现在是指向scriptname.py的特殊链接文件;键入./scriptname时,OS X将有效地将其视为键入./scriptname.py的快捷方式。这意味着您仍然可以编辑和导入scriptname.py等,但可以作为./scriptname运行它。 ln scriptname.py scriptname硬链接文件。注意这次缺少-s。这意味着这两个名称只是磁盘上同一文件的不同名称。这与前一个效果类似,但不太清楚发生了什么,所以可能不是你想要的。 cp scriptname.py scriptname复制文件。这意味着,如果以后编辑scriptname.py,将不会对./scriptname产生影响,除非重复该副本,因为它们是完全独立的文件。这几乎总是导致灾难;总有一天,你会忘记拷贝,花了四个小时调试一些你知道已经修复的东西,因为修复程序没有符合你实际运行的脚本。
通常要做的一件事是将它作为scriptname.py保留在开发目录中,但一旦它正常工作,就可以将它作为scriptname安装到路径上的某个地方。例如,安装-m755 scriptname.py/usr/local/bin/scriptname。那么,实际上您不必以./scriptname的形式运行它,您只需以scriptname的形式运行它即可。但是,如果这是您想要的,您最好不要手动执行,而是学习如何构建Python发行包,编写一个setup.py,在每个平台上做正确的事情,处理用户与系统范围的安装,等等。

什么操作系统?如果在终端中运行哪一个python,输出是什么?是否使脚本可执行?我在Mac上,试图通过终端执行。我对Python及其编译过程不是很熟悉,所以我不确定是否应该先编译,然后像我一样尝试执行它。如果是这样的话,我们将非常感谢您在这方面提出的一些建议。至于运行哪个python,我得到了/usr/bin/local/python。我使用chmod+x使脚本可执行。使用import sys而不是from sys import*使用import sys会导致另一个错误:import:command not found。太棒了,这几乎解决了这个问题。现在,我可以使用./scriptname.py很好地运行脚本,但仍然不能仅使用./scriptname运行脚本。还有一件我还没找到吗?@user3233838:那是同一份文件吗?O
r是一个符号链接到另一个还是什么?如果不是……那是你的问题。在Unix中,扩展名是文件名的一部分;只有在窗户里你们才能把它们关掉。谢谢你们。我肯定越来越近了。在我的路径上安装脚本后,我可以只使用scriptname运行它。我通常不太挑剔,但我相信这个文件不能被处理,除非它采用所需的确切格式,即./scriptname。上述建议是否可以更改为使用./before运行?@user3233838:在这种情况下,不要将其安装在路径上;只需按照上一段的建议执行:重命名、硬链接、符号链接或将脚本复制到scriptname。我想你知道这四个的区别,你想怎么做就怎么做?我其实不知道。如果你能建议哪种选择是最好的,并给我一个如何做的快速想法,那将是超级棒和非常感谢!