【问题标题】:Changing PYTHONPATH in shell在 shell 中更改 PYTHONPATH
【发布时间】:2013-02-25 06:14:26
【问题描述】:

我是 Python 和 shell 脚本的全新用户,并且在这方面遇到了死胡同,即使在谷歌搜索这个问题并将我的头撞在桌子上之后也是如此。任何帮助表示赞赏!

我在一个通过 SSH 连接的 shell 上运行 Python 2.7.3;我下载了一些代码来运行一些程序/分析。当我执行初始程序时,出现以下错误:

    Traceback (most recent call last):
    File "./[script1].py", line 7, in <module>
    import [script1]
    File "[directory]/[script].py", line 22, in <module>
    import gdata.spreadsheet.service
    ImportError: No module named gdata.spreadsheet.service

[Script 1] 是指在同一文件夹中作为代码包的一部分出现的 python 脚本,它还调用 Google Data python 包,我已将其下载到同一文件夹并进行了 gunzip 和 tar 解压,然后安装(使用 ./configure 等)基于查找错误,我最好的猜测是这里的 PYTHONPATH 有问题,它没有找到 [script1].py 和 Gdata 文件夹,即使两者与我正在运行的脚本位于同一目录中。 “Echo $PYTHONPATH”告诉我它是一个未定义的变量,并且目录中还有一个空白的 init.py 文件。该目录中的任何地方都没有包含单词“bash”或“bashrc”的文件。同样,我似乎找不到任何“sys.path”文件,尽管当我启动 Python 并 print(sys.path) 我得到了结果输出:

['', 
'/usr/lib/python2.7',
'/usr/lib/python2.7/plat-linux2',
'/usr/lib/python2.7/lib-tk',
'/usr/lib/python2.7/lib-old',
'/usr/lib/python2.7/lib-dynload',
'/usr/local/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages/PIL',
'/usr/lib/python2.7/dist-packages/gst-0.10',
'/usr/lib/python2.7/dist-packages/gtk-2.0',
'/usr/lib/pymodules/python2.7',
'/usr/lib/python2.7/dist-packages/ubuntu-sso-client',
'/usr/lib/python2.7/dist-packages/ubuntuone-client',
'/usr/lib/python2.7/dist-packages/ubuntuone-installer',
'/usr/lib/python2.7/dist-packages/ubuntuone-storage-protocol',
'/usr/lib/python2.7/dist-packages/wx-2.8-gtk2-unicode']

我也试过

export PYTHONPATH=[directory]

在我的 shell 中,但它会吐出“export: command not found”。

请原谅所有这一切的新手 - 对此的任何帮助(无论我的怀疑是否正确,以及如何解决它们)将不胜感激!

【问题讨论】:

  • 你用的是什么外壳?每个 shell 中设置变量的语法都不同。 PYTHONPATH 通常是未定义的。
  • 这看起来不像程序的完整输出。
  • Eric,我正在运行 CygWin 以通过 ssh 连接到我大学服务器上的集群 - 有没有办法从那里找出哪个 shell?
  • 编辑您的答案以包含完整的输出,不要将其粘贴到评论中,因为这很难阅读。
  • 谢谢!那么 sys.path 是否等同于 PYTHONPATH?如果是这样,那么我直接修改 sys.path[0] 并将其设置为与所有脚本相同的当前目录?

标签: python pythonpath


【解决方案1】:

设置 PYTHONPATH

根据您尝试的export 命令的输出,您使用的shell 看起来不是bash。 This post 涵盖了一些有关如何找出您所在的 shell 的方法。找到你的 shell 后,你可以了解如何在那个 shell 中设置环境变量(PYTHONPATH)。

您也可以尝试这些来在运行脚本期间设置 PYTHONPATH(最后一个应该在 (T)CSH 上工作):

PYTHONPATH=your_directory python script_name

env PYTHONPATH=your_directory python script_name

测试您设置的 PYTHONPATH 是否有效

要查看 PYTHONPATH 是否真正在 Python 中设置和工作,而不是像上面那样使用 python script_name 运行脚本,请使用 python -c 'import os; print os.getenv("PYTHONPATH")'。它应该会显示您刚刚设置的 PYTHONPATH。

同样,在 Python 解释器中打印 sys.path 应该将 PYTHONPATH 中的路径作为条目之一输出。

如果 PYTHONPATH 设置正确

如果您成功设置了 PYTHONPATH 并且问题仍然存在,请尝试从 gdata 所在的路径运行 Python 解释器。

cd path_which_has_subdirectory_gdata
python

在 Python 解释器中,尝试导入 gdata 模块:

import gdata

如果可行,请尝试导入导致ImportError 的模块:

import gdata.spreadsheet.service

如果这些导入可以从 Python 解释器工作,那么您的 [script1] 可能有问题。如果不是,请尝试确认 gdata 模块确实在您认为的位置;模块的正确目录应包含一个名为 __init__.py 的文件,并且 PYTHONPATH 应设置为指向层次结构中模块上方的目录。

【讨论】:

  • 嗨 Miikkas,哇,非常感谢!这很有帮助。根据您的回复,我发现我在 TCSH。我使用“env PYTHONPATH”设置了 PYTHONPATH,并使用上面建议的代码和“echo env $PYTHONPATH”进行了确认。但是,当我运行程序时,它返回相同的错误。现在我将 PYTHONPATH 指向包含“gdata”的文件夹。当我“cd directory_with_gdata_and_other_python_module”,启动 python,并输入“import gdata”或“import [module2]”时,我仍然得到“ImportError:没有名为 gdata 的模块”或 [module2]。我现在将 PYTHONPATH 设置为错误的东西吗?谢谢!!!
  • 您好,很高兴能帮到您。 :) 似乎您现在正在正确设置 PYTHONPATH 并且您的 gdata 模块存在某种问题。 gdata 目录的内容是什么?它是否包含__init___.py? Python 根据包含__init___.py 文件的模块目录来检测模块。
  • 文件夹中有一个(空白)init.py 文件,但它是 gdata 深处的几个文件夹。我也尝试在 gdata 中将 PYTHONPATH 设置为该子文件夹,结果相同。谢谢!
  • PYTHONPATH 应该指向包含__init__.py 的路径的正上方,即如果__init__.py 文件位于/foo/dir1/dir2 中,则PYTHONPATH 应相应地设置为/foo/dir1。希望这会有所帮助!
  • 好的,这似乎已经解决了 gdata 的问题 - 遇到了其他问题,但这已得到修复。非常感谢!!!