更改Python路径:helloworld.py返回命令未找到
非常抱歉问这样一个尴尬的问题——
我正在使用我的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 个回答
我想补充一点:除了上面提到的权限和路径问题,还有一种情况也可能导致你遇到同样的错误。
即使权限设置正确,文件开头的shebang(指明脚本解释器的行)也没问题,如果你最开始是在Windows上写的文件,然后复制到Linux上,你仍然可能会看到“找不到命令”的错误。这是因为Windows和Linux在行结束符上有区别,导致文件中多了额外的'\r'字符。
这种情况是因为文件里有一些不可见的字符。你可以通过以下方式检查:
cat -v <filename>:
#!/usr/intel/bin/python^M
多出来的“^M”就是问题所在。使用'dos2unix'命令来转换文件格式,然后就可以正常运行了。
我们先来看看你收到的第一个错误信息。理解错误信息是很重要的。
-bash: helloworld.py: command not found
这个错误说明 helloworld.py 不是一个可以直接执行的命令。要运行这个文件,你有两个选择:
- 用 Python 解释器来运行它。你可以输入
python helloworld.py
- 把这个文件设置为可执行文件,然后直接运行它。你可以输入
./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
。
要把一个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中不要用分号作为行结束符。这样做不是必须的,而且看起来很难看!