我有一个可在ipython内运行的脚本,但是当我尝试从命令行运行相同的脚本时,我收到要导入的本地模块的导入错误:
from helper_functions.email_from_server import send_email
错误:
ImportError:没有名为helper_functions.email_from_server的模块
该脚本从Ipython导入,没有任何问题。
相对而言,我在ipython中运行的代码没有任何问题,我可以使用以下命令运行另一个脚本:
运行script.py
在命令行中,我可以运行相同的脚本:
python /dir/script.py
但是,此python /dir/script.py不适用于具有本地导入的脚本(从上面),我不知道它是pythonpath问题还是某些本地环境问题?我一直在阅读堆栈以找到它,但是到目前为止还没有找到。感觉就像指日可待
一种尝试的解决方案:
PYTHONPATH = / dir / python /dir/script.py
编辑(以帮助澄清):
我在Linux机器上使用anaconda发行版。
ipython可能正在使用其他一些python可执行文件。 因此,也许您安装了anaconda并在其中使用了ipython,但cmd调用了一些vanilla-python dist。 但请再次阅读您的问题,并检查您是否提供了足够的信息。 您甚至没有告诉我们您正在使用什么操作系统。
您能告诉我们您收到的脚本和错误消息吗? 不知道你看到了什么,任何人都会很难帮助
@sascha-感谢您的评论-编辑以澄清
@SteelyDanish请仔细阅读最简单的示例,这不是示例。
@WayneWerner谢谢-试图根据那些标准进行重构
用PYTHONPATH乱搞是悲伤的秘诀。 您可以做到,但不可以。 正确的做法是将软件包安装在正确的环境中。 如果您不知道如何创建包,那么这里有一个非常简单的示例。 通过ipython vs命令行运行时,路径可能会有一些差异。
您可以使用sys.executable和sys.path找出不同之处:
import sys
print(sys.executable)
print(sys.path)
从IPython运行该程序,然后从命令行上的python运行该程序。 无疑,您将获得两个不同的结果。 由于您正在运行Anaconda,因此您要遵循其安装非conda软件包的指南来安装自己构建的软件包。
当然,这当然是假设您的路径上有PythonPython-您可以使用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路径-这就是我的假设。我试图重写问题。 (stackoverflow.com/questions/42823059/)
这对于确定我在ipython和python中的sys.path中是否存在差异非常有帮助
我通过创建包装器外壳脚本解决了该问题。 麻烦的是,我每次都导出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