【问题标题】:How can I use a Python script in the command line without cd-ing to its directory? Is it the PYTHONPATH?如何在命令行中使用 Python 脚本而不使用 cd-ing 到其目录?是 Python 路径吗?
【发布时间】:2013-11-23 21:53:37
【问题描述】:

如何使用 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'

cd 到文件目录后运行..

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

为什么我不能使用 PYTHONPATH?

【问题讨论】:

  • 我们可以更改这篇文章的标题吗?它实际上并没有要求对PYTHONPATH进行解释。
  • 编辑标题,因为这是在谷歌搜索PYTHONPATH时出现的第一件事

标签: python unix


【解决方案1】:

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

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

除了普通目录,单独的 PYTHONPATH 条目可能 参考包含纯 Python 模块的 zipfiles(在源代码或 编译形式)。扩展模块不能从 zipfile 中导入。

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

前面的搜索路径中会插入一个附加目录 的 PYTHONPATH ,如上面接口选项下所述。搜索 path 可以在 Python 程序中作为变量进行操作 系统路径。

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

【讨论】:

  • 谢谢朋友。我还在解决这个问题。我的脚本确实成功地从我的自定义 PYTHONPATH 导入了我的模块。现在我明白了区别:这都是关于脚本与模块的;命令脚本调用与 python 导入。是的,我实际上会使用export PATH=$PATH:/home/etc
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

    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 代码。
    • 老实说,我不认为在系统相关路径中安装需要 root 访问权限的东西比使用 PYTHONPATH 更好。我不再数多少次我不得不处理一个基本的 Python 程序,它坚持 pip install 的事情,我是主机上的普通用户,不仅没有 root 访问权限(我知道 pip 可以做本地安装)但也没有点子。这是给所有分发 Python 软件的人的建议——首先尝试在没有 root 访问权限且只有没有 pip 的核心 Python 分发的 vanilla Linux 主机上安装自己的软件。
    【解决方案4】:

    按照您的示例设置 PYTHONPATH,您应该可以这样做

    python -m gmbx
    

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

    【讨论】:

      【解决方案5】:

      我认为您混淆了 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
      

      【讨论】:

        猜你喜欢
        • 2017-11-22
        • 2019-06-18
        • 2014-12-13
        • 2015-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-28
        • 1970-01-01
        相关资源
        最近更新 更多