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

2024-06-16 13:59:49 发布

您现在位置:Python中文网/ 问答频道 /正文

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

./scriptname arg1 arg2 arg3

如果使用以下命令,代码将编译并运行:

^{pr2}$

如果我尝试使用所需的命令,我会得到一个错误声明:from:cannotread/var/mail/sys

我的代码开头如下:

^{3}$

如果您能帮助我以正确的命令格式获得可执行文件,我们将不胜感激!在


Tags: 文件代码from命令可执行文件声明错误方式
1条回答
网友
1楼 · 发布于 2024-06-16 13:59:49

当使用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命令。例如:

$ 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。在


同时,如果您只运行./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 scriptnamesymlinks文件。这意味着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在每个平台上都能正确地执行任务,处理用户与系统之间的安装等

相关问题 更多 >