更改Python路径:helloworld.py返回命令未找到

7 投票
6 回答
29919 浏览
提问于 2025-04-16 15:41

非常抱歉问这样一个尴尬的问题——

我正在使用我的MacBook Pro,系统是雪豹(Snow Leopard),用的是Python 2.7.1。我正在尝试运行我的第一个脚本,但所有教程的第一页都在嘲笑我:

让我先说一下:

$ whereis python  
/usr/bin/python  
$ which python
/Library/Frameworks/Python.framework/Versions/2.7/bin/python

(这是我的问题吗?)

我在vim中写了helloworld.py,存放在/users/charles目录下:

$ vim helloworld.py  
#!/usr/bin/python  
# Hello World Python Program  

print "Hello World!";

当我尝试从终端运行它时:

$ helloworld.py
-bash: helloworld.py: command not found

当我尝试从Python运行它时:

$ python
>>> helloworld.py
Traceback (most recent call last):
  File :<stdin>", line 1, in <module>
NameError: name 'helloworld' is not defined

来自《Dive Into Python》(不确定这是否相关):

$ python
>>> import sys,os
>>> print 'sys.argv[0] =',sys.argv[0]
sys.argv[0]=
>>> pathname=os.path.dirname(sys.argv[0])
>>> print 'path=',pathname
path=
>>> print 'full path=',os.path.abspath(pathname)
full path= /Users/charles

我感到困惑!我需要修改我的路径,让它找到我的脚本吗?

我对编程完全是新手,实际上我刚刚发现终端是可以用的。

谢谢!

6 个回答

3

我想补充一点:除了上面提到的权限和路径问题,还有一种情况也可能导致你遇到同样的错误。

即使权限设置正确,文件开头的shebang(指明脚本解释器的行)也没问题,如果你最开始是在Windows上写的文件,然后复制到Linux上,你仍然可能会看到“找不到命令”的错误。这是因为Windows和Linux在行结束符上有区别,导致文件中多了额外的'\r'字符。

这种情况是因为文件里有一些不可见的字符。你可以通过以下方式检查:

cat -v <filename>:
#!/usr/intel/bin/python^M

多出来的“^M”就是问题所在。使用'dos2unix'命令来转换文件格式,然后就可以正常运行了。

12

我们先来看看你收到的第一个错误信息。理解错误信息是很重要的。

-bash: helloworld.py: command not found

这个错误说明 helloworld.py 不是一个可以直接执行的命令。要运行这个文件,你有两个选择:

  1. 用 Python 解释器来运行它。你可以输入 python helloworld.py
  2. 把这个文件设置为可执行文件,然后直接运行它。你可以输入 ./helloworld.py

在 *nix 系统中,要让文件可以执行,你需要改变它的权限。为此,你可以使用 chmod 命令(想了解更多可以输入 man chmod)。

chmod +x helloworld.py

这里假设你是在包含 helloworld.py 文件的目录下。如果不是,你需要先用 cd 命令切换到那个目录,或者使用文件的完整路径。

前面的 ./ 是必须的,因为它告诉系统在当前目录下运行这个文件,而不是在 $PATH 中查找。$PATH 是一个可能包含可执行文件的路径列表。当你直接运行 helloworld.py 时,系统会在 $PATH 中查找这个文件。为了运行当前目录下的文件,你需要加上 ./,这表示“从这里开始”。

顺便提一下,看看你 Python 脚本的第一行:

#!/usr/bin/python

这行叫做 shebang 行,它告诉系统使用 /usr/bin/python 来加载这个文件。内部来说,这意味着程序加载器会执行 /user/bin/python helloworld.py

最后,当你输入 python 而没有其他参数时,你进入了一个交互式的 Python 解释器会话。在这个环境中,输入 >>> helloworld.py 并不是在引用那个文件,而是被当作 Python 代码来解释的。结果是无效的 Python 代码。这就是你收到第二个错误的原因,NameError: name 'helloworld' is not defined

8

要把一个Python模块或脚本变成在UNIX系统上可以独立运行的程序,你需要做两件事:

1.) 确保你的脚本顶部有一个“shebang”行:

#!/usr/bin/python

2.) 确保脚本文件是可执行的。你可以用chmod命令来做到这一点:

chmod +x /path/to/helloworld.py

/path/to/是你脚本的完整文件路径。如果脚本在当前目录下,你可以省略路径。

% ls -l
total 0
drwxr-xr-x  2 jathan jathan   60 2011-04-13 15:28 ./
drwxrwxrwt 12 root   root   6.5K 2011-04-13 15:28 ../
-rw-r--r--  1 jathan jathan    0 2011-04-13 15:28 helloworld.py

它就在我的当前目录下,所以我们来把它设置为可执行的吧!

% chmod +x helloworld.py 
% ls -l                 
drwxr-xr-x  2 jathan jathan   60 2011-04-13 15:28 ./
drwxrwxrwt 12 root   root   6.5K 2011-04-13 15:28 ../
-rwxr-xr-x  1 jathan jathan    0 2011-04-13 15:28 helloworld.py*

看到左边权限位上的“x”了吗?你成功了!现在我们可以运行它了:

% ./helloworld.py   
Hello World!

最后,记住在Python中不要用分号作为行结束符。这样做不是必须的,而且看起来很难看!

撰写回答