如何在不使用CD-cd进入目录的情况下在命令行中使用Python脚本?是PYTHONPATH吗?


157

如何使用PYTHONPATH?当我尝试在路径中运行脚本时,找不到文件。当我进入包含该脚本的目录时,该脚本将运行。那么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'

cd到文件目录后,它运行..

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

为什么我不能使用PYTHONPATH?


1
我们可以更改此帖子的标题吗?它实际上并不是要对进行解释PYTHONPATH
Nico Cernek

编辑标题,因为这是在谷歌搜索时首先显示的内容PYTHONPATH
拉斐尔

Answers:


194

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

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

除了普通目录外,单独的PYTHONPATH条目还可以引用包含纯Python模块(以源代码或编译形式)的zipfile。无法从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。这样的事情应该起作用:

#!/usr/bin/env python

并赋予执行特权:

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

然后,您应该可以轻松地gmbx.py从任何地方运行。


2
谢谢你,朋友。我仍在解决这个问题。我的脚本确实成功地从我的自定义PYTHONPATH导入了模块。现在,我了解了区别:所有内容都与脚本与模块有关;命令脚本调用与python导入。是的,我实际上会使用export PATH=$PATH:/home/etc
Randy Skretka,2013年

57

您混淆了PATH和PYTHONPATH。您需要这样做:

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

python解释器使用PYTHONPATH确定要加载的模块。

Shell使用PATH来确定要运行的可执行文件。


38

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

需要PYTHONPATH设置不是一个好主意-就像任何依赖于环境变量的东西一样,在不同的机器上一致地复制东西变得棘手。更好的方法是使用可以在Python已经知道的系统相关路径中安装(使用'pip'或distutils)的Python'packages'。

阅读https://the-hitchhikers-guide-to-packaging.readthedocs.org/en/latest/- “ The Hitchhiker's Packaging Guide”,以及http://docs.python.org/3/tutorial /modules.html-在较低级别解释PYTHONPATH和软件包。


点了。在这种特殊情况下,添加到PYTHONPATH似乎效果很好。作为一台计算机上的一个用户,我可以很好地利用和重用一些已经编写的.py代码。
兰迪·斯克雷特卡

1
老实说,我认为在需要根访问权限的系统依赖路径中安装东西比使用更好PYTHONPATH。我不再计算需要处理一个简单的Python程序的次数,该程序坚持要求pip install我是主机上的常规用户,不仅没有root访问权限(我知道pip可以进行本地安装),而且也没有点子。这是给所有分发Python软件的人的建议-尝试在没有root访问权且只有核心Python分发而没有pip的原始Linux主机上安装自己的软件。
AMN

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

3

如示例中那样设置PYTHONPATH,您应该可以

python -m gmbx

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.