如何在命令行中使用Python脚本而无需cd到其目录?是PYTHONPATH吗?

165

我该怎样使用PYTHONPATH?当我尝试在路径中运行脚本时,找不到文件。当我cd到包含脚本的目录时,脚本才能运行。那么PYTHONPATH有什么用处呢?

$ echo $PYTHONPATH
:/home/randy/lib/python

$ tree -L 1 '/home/randy/lib/python' 
/home/randy/lib/python
├── gbmx_html.py
├── gbmx.py
├── __init__.py
├── __pycache__
├── scripts
└── yesno.py

$ python gbmx.py -h
python: can't open file 'gbmx.py': [Errno 2] No such file or directory

$ cd '/home/randy/lib/python'

在进入文件目录后,运行..

$ python gbmx.py -h
usage: gbmx.py [-h] [-b]

为什么我无法使用PYTHONPATH?

1
我们能否更改这篇文章的标题?它实际上并没有要求解释 PYTHONPATH - user5791460
修改标题,因为这是在谷歌搜索“PYTHONPATH”时首先显示的内容。 - raphael
5个回答

199

我认为你有点困惑。PYTHONPATH 设置用于 导入 Python 模块的搜索路径,而不是像你尝试做的那样用于执行它们。

PYTHONPATH 增加了模块文件的默认搜索路径。格式与 shell 的 PATH 相同:一个或多个目录路径,由 os.pathsep 分隔(例如,在 Unix 上为冒号,在 Windows 上为分号)。不存在的目录将被静默忽略。

除了普通目录外,单个 PYTHONPATH 条目还可以引用包含纯 Python 模块(以源代码或编译形式)的 zip 文件。无法从 zip 文件中导入扩展模块。

默认搜索路径取决于安装,但通常以 prefix/lib/pythonversion 开头(请参阅上面的 PYTHONHOME)。它总是附加到 PYTHONPATH 后面。

在接口选项下述中所述的方式前,将插入另一个目录以位于 PYTHONPATH 前面。可以从 Python 程序内部操纵搜索路径,如变量 sys.path 所示。

http://docs.python.org/2/using/cmdline.html#envvar-PYTHONPATH

你要找的是 PATH。

export PATH=$PATH:/home/randy/lib/python 

然而,要将你的Python脚本作为程序运行,你还需要在第一行设置一个Python的shebang。类似这样的内容应该可以工作:

然而,要将你的Python脚本作为程序运行,你还需要在第一行设置一个Python的shebang。类似这样的内容应该可以工作:

#!/usr/bin/env python

并给它执行权限:

chmod +x /home/randy/lib/python/gbmx.py

那么您应该能够简单地从任何地方运行 gmbx.py


2
谢谢朋友。我还在完善这个程序。我的脚本成功地从自定义PYTHONPATH中导入了模块。现在我明白了区别所在:脚本与模块;命令脚本调用与python导入。是的,我确实会使用export PATH=$PATH:/home/etc - Randy Skretka

60

您混淆了PATH和PYTHONPATH。您需要执行以下操作:

export PATH=$PATH:/home/randy/lib/python 

PYTHONPATH被Python解释器用于确定要加载哪些模块。

PATH被Shell用于确定要运行哪些可执行文件。


39

PYTHONPATH仅影响import语句,而不影响Python解释器对作为参数给出的python文件的顶层查找。

需要设置PYTHONPATH并不是一个好主意 - 与任何依赖于环境变量的东西一样,在不同的机器上复制相同的设置变得困难。更好的方法是使用Python“包”,这些包可以安装在系统相关的路径中(使用“pip”或distutils),Python已经知道这些路径。

阅读https://the-hitchhikers-guide-to-packaging.readthedocs.org/en/latest/ - “The Hitchhiker's Guide to Packaging”,以及http://docs.python.org/3/tutorial/modules.html - 这里解释了PYTHONPATH和包的更低级别的内容。


明白了。在这种情况下,将其添加到PYTHONPATH似乎非常好用。作为一个用户在一台机器上,我可以很好地利用和重复使用一些已经编写的.py代码。 - Randy Skretka
1
我真的不认为在需要root访问权限的系统相关路径中安装东西比使用PYTHONPATH更好。我已经不记得有多少次我不得不处理一个基本的Python程序,它坚持要在我作为普通用户的主机上进行pip install操作(我知道pip可以进行本地安装),但是我既没有root访问权限,也没有pip。这里有一个建议,对于每个分发Python软件的人——请先尝试在一个没有root访问权限和没有pip的核心Python发行版的vanilla Linux主机上安装自己的软件。 - Armen Michaeli

5
使用您的示例设置PYTHONPATH后,您应该能够执行以下操作:
python -m gmbx

选项-m将使Python在通常搜索模块的路径中搜索您的模块,包括您添加到PYTHONPATH中的内容。当您像这样运行解释器python gmbx.py时,它会查找特定的文件,而PYTHONPATH不适用。

3

我认为你混淆了PATH和PYTHONPATH。要运行脚本,只需将其父目录添加到您的PATH变量即可。您可以通过运行以下命令来测试:

which myscript.py

此外,如果 myscripy.py 依赖于自定义模块,则它们的父目录也必须添加到 PYTHONPATH 变量中。不幸的是,由于 Python 设计者显然服用了毒品,使用以下内容在 repl 中测试导入操作无法保证 PYTHONPATH 设置正确以供脚本使用。Python 编程的这一部分非常神奇,不能在 stackoverflow 上得到恰当的解答。
$python
Python 2.7.8 blahblahblah
...
>from mymodule.submodule import ClassName
>test = ClassName()
>^D
$myscript_that_needs_mymodule.submodule.py
Traceback (most recent call last):
  File "myscript_that_needs_mymodule.submodule.py", line 5, in <module>
    from mymodule.submodule import ClassName
  File "/path/to/myscript_that_needs_mymodule.submodule.py", line 5, in <module>
    from mymodule.submodule import ClassName
ImportError: No module named submodule

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