【问题标题】:Script working in ipython but not from the command line脚本在 ipython 中工作,但不是从命令行
【发布时间】:2017-08-05 13:36:15
【问题描述】:

我有一个在 ipython 中运行的脚本,但是当我尝试从命令行运行相同的脚本时,我收到了我尝试导入的本地模块的导入错误:

from helper_functions.email_from_server import send_email 

错误: ImportError:没有名为 helper_functions.email_from_server 的模块

这个脚本从 Ipython 中导入没有任何问题。

相比之下,我的代码在 ipython 中运行时没有任何问题,我可以使用以下命令运行另一个脚本: 运行脚本.py

我可以从命令行运行相同的脚本: python /dir/script.py

但是,此 python /dir/script.py 不适用于具有本地导入(从上面)的脚本,我无法确定它是 pythonpath 问题还是某些本地 env 问题?我一直在阅读堆栈以找到它,但到目前为止还没有。感觉就在拐角处

一个尝试的解决方案: PYTHONPATH=/dir/python /dir/script.py

编辑(帮助澄清): 我在 linux 机器上使用 anaconda 发行版。

【问题讨论】:

  • ipython 可能正在使用其他一些 python 可执行文件。所以也许你安装了 anaconda 并使用 ipython,但是 cmd 调用了一些 vanilla-python dist。但请再次阅读您的问题并检查您是否提供了足够的信息。您甚至没有告诉我们您使用的是什么操作系统。
  • 你能告诉我们你得到的脚本和错误信息吗?在不知道您所看到的情况下,任何人都很难提供帮助
  • @sascha -- 感谢 cmets -- 编辑澄清
  • @SteelyDanish 请阅读minimal reproducible example 的构成要素——这不是一个。
  • @WayneWerner 谢谢 - 尝试根据这些标准进行重构

标签: python import environment-variables ipython pythonpath


【解决方案1】:

PYTHONPATH 混在一起是悲伤的秘诀。你可以这样做,但你不应该这样做。正确的做法是将软件包安装在正确的环境中。如果您不知道如何创建包here's a super simple example。通过 ipython vs 命令行运行时,您的路径可能会有所不同。

您可以使用sys.executablesys.path 找出它们的区别:

import sys
print(sys.executable)
print(sys.path)

从 IPython 运行它,然后从命令行上的 python 运行它。你无疑会得到两种不同的结果。由于您正在运行 Anaconda,因此您希望 follow their guide 安装非 conda 软件包以安装您构建的软件包。

当然,这假设您的路径上有 anaconda python - 您可以使用which python 进行检查,因为您使用的是 Linux。

【讨论】:

  • 感谢 Wayne - ipython 和 python 的 sys.executable 是相同的。我没有将它构建为一个包 - 所以也许这就是问题的一部分。如果可能的话,我希望在不必构建包的情况下执行脚本。
  • 如果你要制作一个包,你应该制作一个包,否则你应该有一个大文件,分成小函数和类,然后运行它。这假设您不会重用任何代码。但是,如果您正在编写代码以供重用,那么您就是在尝试创建一个包。我已经添加了关于路径的答案 - 如果 sys.path 相同,那么有些事情很奇怪。
  • 谢谢@Wayne Werner 我检查了 sys.path,它们与我的 python sys 路径几乎相同,但有一个额外的路径(anaconda/bin 的位置)。如果我将这一行放在 --> /home/anaconda2/bin/python /project_folder/script.py 中,是否会适当地导入 sys 路径——这就是我的假设。我试图重新写下这个问题。 (*.com/questions/42823059/…)
  • 这对于识别 ipython 和 python 中的 sys.path 是否存在差异非常有帮助
【解决方案2】:

我通过创建包装外壳脚本解决了这个问题。丑陋的是我每次都在导出 python 路径,但它可以工作。

#!/bin/bash
export PYTHONPATH="${PYTHONPATH}:/my/dir"
source ~/.bash_profile
cd /my/dir && my/anaconda/location/bin/python /my/dir/to/script/cript.py

【讨论】:

    最近更新 更多