如何在命令行中使用 Python 脚本而不对其目录执行 cd-ing? 它是 PYTHONPATH 吗?

如何使用 PYTHONPATH?当我尝试在路径中运行脚本时,文件不是 当我 cd 到保存脚本的目录时,脚本就会运行 巨蟒?

$ 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?

464861 次浏览

你把 PATH 和 PYTHONPATH 搞混了,你必须这么做:

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

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

PATH 由 shell 用来确定要运行哪些可执行文件。

我觉得你有点糊涂了。PYTHONPATH 为 进口 python 模块设置搜索路径,而不是像您正在尝试的那样执行它们。

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

除了普通目录之外,各个 PYTHONPATH 条目可以 引用包含纯 Python 模块的 zipfiles (在源代码或 扩展模块不能从 zipfiles 导入。

默认的搜索路径是依赖于安装的,但通常是 以前缀/lib/pythonversion 开头(请参见上面的 PYTHONHOME) 总是附加到 PYTHONPATH。

前面的搜索路径中将插入另一个目录 的 PYTHONPATH,如上所述在接口选项。搜索 可以在 Python 程序中作为变量操作 path Sys.path.

Http://docs.python.org/2/using/cmdline.html#envvar-pythonpath

你要找的是 PATH。

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

但是,要将 Python 脚本作为程序运行,还需要在第一行中为 Python 设置 开始吧。这种方法应该可行:

#!/usr/bin/env python

并赋予其执行特权:

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

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

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

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

阅读 https://the-hitchhikers-guide-to-packaging.readthedocs.org/en/latest/-“包装搭便车指南”,也阅读 http://docs.python.org/3/tutorial/modules.html-解释 PYTHONPATH 和较低层次的包装。

我觉得你把 PATH 和 PYTHONPATH 搞混了。运行“ script”所需要做的就是将它的父目录附加到 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

如果像您的示例中那样设置了 PYTHONPATH,您应该能够执行

python -m gmbx

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