2024-06-16 13:59:49 发布
网友
我正在尝试创建一个可执行文件,该文件可以按如下方式执行:
./scriptname arg1 arg2 arg3
如果使用以下命令,代码将编译并运行:
如果我尝试使用所需的命令,我会得到一个错误声明:from:cannotread/var/mail/sys
我的代码开头如下:
如果您能帮助我以正确的命令格式获得可执行文件,我们将不胜感激!在
当使用shebang从脚本指定解释器时,#!必须是文件中的前两个字节。在
#!
如果在#前面有一个换行符、空格、UTF-8bom、不可见字符等,那么它就不是shebang行。如果您将文件保存为UTF-16,因此文件以等效的ASCII字节#\0!\0开头,那么它不是shebang行。在
#
#\0!\0
如果没有shebang行,则脚本将由默认shell运行。这意味着from sys import *行是通过运行from命令来解释的,如/usr/bin/from,它将其第一个参数视为用户名,并为用户sys查找不存在的邮件假脱机。而import sys行是通过运行import命令来解释的,这个命令并不存在。在
from sys import *
from
/usr/bin/from
sys
import sys
import
要查看文件的原始字节数,可以使用OS X内置的hexdump命令。例如:
hexdump
$ 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 |
第一个代码从运行python的shebang行开始(通过env工具)。第二个以NUL字节开头(注意,00 23 21而不是23 21-或者更简单地说,是.#!,而不是{}),因此它运行shell。在
env
00 23 21
23 21
.#!
同时,如果您只运行./scriptname,这实际上是在尝试运行一个名为scriptname的程序,没有扩展名。Unix不像Windows,它试图猜测不同的扩展名,比如scriptname.exe或{}或{},直到其中一个能正常工作。在
./scriptname
scriptname
scriptname.exe
因此,如果您想让它以./scriptname的形式运行,那么必须重命名、硬链接、符号链接或将scriptname.py复制到scriptname。从你最想要的(我猜)到最少的顺序是:
scriptname.py
mv scriptname.py scriptname
ln -s scriptname.py scriptname
./scriptname.py
ln scriptname.py scriptname
-s
cp scriptname.py scriptname
一个常见的做法是在您的开发目录中将其保留为scriptname.py,但是一旦您使它工作起来,就将它安装到路径上的某个地方,作为scriptname。例如,install -m755 scriptname.py /usr/local/bin/scriptname。然后,您不必(事实上,不能)以./scriptname的形式运行它,只需以scriptname的形式运行它。但是,如果这正是您想要的,那么最好不要手动执行,而是学习如何构建Python发行包,编写一个setup.py在每个平台上都能正确地执行任务,处理用户与系统之间的安装等
install -m755 scriptname.py /usr/local/bin/scriptname
setup.py
当使用shebang从脚本指定解释器时,
#!
必须是文件中的前两个字节。在如果在
#
前面有一个换行符、空格、UTF-8bom、不可见字符等,那么它就不是shebang行。如果您将文件保存为UTF-16,因此文件以等效的ASCII字节#\0!\0
开头,那么它不是shebang行。在如果没有shebang行,则脚本将由默认shell运行。这意味着
from sys import *
行是通过运行from
命令来解释的,如/usr/bin/from
,它将其第一个参数视为用户名,并为用户sys
查找不存在的邮件假脱机。而import sys
行是通过运行import
命令来解释的,这个命令并不存在。在要查看文件的原始字节数,可以使用OS X内置的
hexdump
命令。例如:第一个代码从运行python的shebang行开始(通过}),因此它运行shell。在
env
工具)。第二个以NUL字节开头(注意,00 23 21
而不是23 21
-或者更简单地说,是.#!
,而不是{同时,如果您只运行}或{},直到其中一个能正常工作。在
./scriptname
,这实际上是在尝试运行一个名为scriptname
的程序,没有扩展名。Unix不像Windows,它试图猜测不同的扩展名,比如scriptname.exe
或{因此,如果您想让它以
./scriptname
的形式运行,那么必须重命名、硬链接、符号链接或将scriptname.py
复制到scriptname
。从你最想要的(我猜)到最少的顺序是:mv scriptname.py scriptname
重命名文件。这意味着您不再有一个名为scriptname.py
的文件,只有一个名为scriptname
的文件。这是最简单的选择。但这确实意味着您现在必须编辑scriptname
,而不是{scriptname.py
是用来作为一个模块在其他Python脚本中被import
编辑的,以及一个要直接运行的脚本。但是,如果这些都不是问题的话,这是最简单的选择。在ln -s scriptname.py scriptname
symlinks文件。这意味着scriptname
现在是指向scriptname.py
的特殊“链接文件”;当您键入./scriptname
时,OSX将有效地将其视为键入./scriptname.py
的快捷方式。这意味着您仍然可以编辑(和import
,依此类推)scriptname.py
,但将其作为./scriptname
运行。在ln scriptname.py scriptname
硬链接文件。(注意这次缺少-s
)这意味着这两个名称只是磁盘上同一个文件的不同名称。这和前一个有相似的效果,但它不太明显发生了什么,所以它可能不是你想要的。在cp scriptname.py scriptname
复制文件。这意味着如果您以后编辑scriptname.py
,那么这对./scriptname
没有任何影响,除非您重复复制(因为它们是完全独立的文件)。这几乎总是会导致灾难;总有一天你会忘了拷贝,花了四个小时调试一些你知道你修复了的东西,因为修复程序没有成功地应用到你实际运行的脚本中。在一个常见的做法是在您的开发目录中将其保留为
scriptname.py
,但是一旦您使它工作起来,就将它安装到路径上的某个地方,作为scriptname
。例如,install -m755 scriptname.py /usr/local/bin/scriptname
。然后,您不必(事实上,不能)以./scriptname
的形式运行它,只需以scriptname
的形式运行它。但是,如果这正是您想要的,那么最好不要手动执行,而是学习如何构建Python发行包,编写一个setup.py
在每个平台上都能正确地执行任务,处理用户与系统之间的安装等相关问题 更多 >
编程相关推荐