【问题标题】:Python cannot run module from command line; IPython canPython 无法从命令行运行模块; IPython 可以
【发布时间】:2016-06-07 16:05:36
【问题描述】:

这是我的模块的目录结构: Directory Structure

可以看出DataProcessor是一个模块,里面DataLoader有一定的功能。

lda 模块中,文件HFT.py 有一行 从数据处理器导入数据加载器

我正在尝试从主目录274-Yelp/ 运行lda/HFT.py

python lda/HFT.py
这给出了以下错误:

Traceback (most recent call last):
  File "lda/HFT.py", line 6, in <module>
    from DataProcessor import DataLoader
ImportError: No module named DataProcessor

但是,当我跑步时
ipython lda/HFT.py
它运行!

我正在使用位于主目录 274-Yelp/ 中的 virtualenv

谁能告诉我为什么 Ipython 可以导入模块而普通的 Python 解释器不能?

DataProcessor/__init__.py的内容:

import DataLoader
import MatrixConstructor
import ReviewProcessor
import vocabBuilder

lda/__init__.py的内容:

来自 ReviewModel 我

port ReviewModel
from RatingModel import RatingModel
from HFT import HFT

【问题讨论】:

  • 如果你执行 which python 和 a which ipython 结果是什么?
  • 能否指定init.pyDataProcessor模块和lda模块中的内容
  • 尝试在顶部的lda/HFT.py文件中添加sys.path.append(absolute path of DataProcessor module ),在` from DataProcessor import DataLoader`语句之前。
  • which python: .../274B-Yelp/yelp_env/bin/python which ipython: .../274B-Yelp/yelp_env/bin/ipython
  • @Tanu - 我已经在问题中包含了内容。添加 sys.path 应该可以,但即使可以,为什么 iPython 解释我的文件的方式与 Python 的方式之间存在差异?

标签: python python-2.7


【解决方案1】:

您的 python 脚本的路径计算受到初始化程序或 cd 目录的影响,或者您的 ipython 实际上正在启动不同的 python 二进制文件。鉴于您的 ipython 指向您的 virtualenv 目录,我猜它是前者。

通常,您正在从中运行的目录会添加到 sys.path 以使您受益,但看起来您可能是从 Eclipse 中运行此屏幕截图的。每次运行都有自己的当前目录设置,您可以在运行设置下进行配置。

您可能已将工作目录添加到您的 .ipython 文件中(通过 ipython locate 找到),这只会帮助 ipython 运行。

要解决此问题,请将项目根目录的路径添加到两个初始化文件的顶部作为 sys.path.insert(1, 'my/root/path'),或者将单独的模块组合成一个具有相对导入 from ..DataProcessor import DataLoader 的模块。这要求共享父目录有一个__init__.py 文件,但允许运行python -m shareddir.lda.HFT 之类的东西以始终了解其他模块的相对路径。

【讨论】: