Python脚本在Bash中运行出现“Permission denied”错误?

6

我是Ubuntu的新手... 我正在尝试运行我的第一个简单的Python程序 "Hello World" ... 在终端中运行以下命令后:

1. chmod +x filename.py 
2. ./filename.py

终端显示以下错误:“bash: ./filename.py: Permission denied”,该怎么解决这个问题呢?

3
你能执行 ls -l filename.py 命令并将结果发出来吗?我对文件权限很好奇(虽然使用 chmod +x filename.py 命令才是正确的让该文件可执行的方法)。 - Levon
你的脚本第一行有 #!/usr/bin/env python 吗? - Pavel Strakhov
关于 #!/usr/bin/env python#!/usr/bin/python,我在 SO 上使用前者(所有我的脚本仍然如此)被某个人严厉责骂,因为假定你安装了多个版本的 Python,你无法确定哪个Python会执行,所以最好总是指定想要的Python的完整路径。也许我应该将这个问题发布到SO上。 - Levon
使用 /usr/bin/env 是可以的。这只是一种说“使用我在 PATH 中找到的内容”的方式,如果你的 PATH 构建得合理,那么这是完全可以的。如果你要分发你的脚本,我会说这是首选的,因为这样它们就能够使用最终用户的 PATH。但是,如果你需要明确地使用一个特定的 Python 二进制文件,那么请指定它。 - zigg
3个回答

8

你的Python文件顶部是否有适当的咒语?例如:

#!/usr/bin/python(或者替代选项#!/usr/bin/env python

只是为了澄清,chmod +x仅使文件可执行,而不会运行它。

我假设你的脚本看起来不比这个复杂:

#!/usr/bin/env python
print 'hello world'

1
OP正在询问一个Python脚本,因此shebang应该是:#!/usr/bin/env python。而且OP确实说以这种方式运行它会导致错误。 - lvc
@ivc 你说得对..我会更新我的答案 - 谢谢你指出来。 - Levon
非常感谢大家。@Levon感谢您编辑我的问题。 +#!/usr/bin/python +打印“你好,世界!” 这是我上面的程序。 - Ammu
@Ammu 没问题。你能否给我们提供 ls -l filename.py 命令的输出,以便我们查看文件权限? - Levon
嗨,Levon终端显示以下信息
  1. -rw-rw-r-- 1 owner owner 40 Jun 15 15:45 first.py
- Ammu

5

一些可能性:

  1. 如果输入 umask 命令会显示什么?只有当你的 umask 没有阻止用户可执行位时,chmod +x 命令才能使文件对你可执行。一个典型的 umask,例如 0022,不会阻止用户执行位,但是像 0122 这样的 umask 可以阻止它。(有关更多信息,请参见 chmod(1) 的描述部分。)

  2. 要执行 Python 脚本等脚本,您还需要具有读取权限。尝试 chmod u+rx filename.py 并重新执行脚本。

  3. 也有可能你在文件开头的 "hashbang" 行中指定的解释器(例如 #!/usr/bin/env python)没有可执行权限,尽管根据我的经验,这种情况会产生不同的错误消息。


嗨Zigg, 1.非常感谢你的回答。 2.现在它能正常工作了,但是chmod -x和chmod u+rx背后的问题是什么? - Ammu
chmod -x 会从用户、组和其他人中删除执行权限,但仅当umask不包含这些执行位时才会删除。有关更多信息,请参阅 http://linux.die.net/man/1/chmod 中的 chmod 手册页面。chmod u+rx 无论umask如何都将设置用户读取和执行位。 - zigg

4
我在我的新系统上遇到了同样的问题。
这已经是我第三次尝试解决它,而你的帖子是谷歌搜索结果中出现的第一个。虽然我的帖子有点晚,但我认为它会帮助其他遇到同样问题的用户。
在我的情况下,问题出在分区表设置上。
请检查你的 /etc/mtab 文件中 python 脚本的存储位置。检查是否有一个叫做 noexec 的条款。 noexec 是一个禁止在该分区下执行的标志。默认情况下,它被设置为 exec。但有时候会发生这种事情。
现在,这里的问题已经解决了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接