导入模块并从其他包访问文件

时间:2014-06-05 10:08:33

标签: python

我有以下项目结构enter image description here

speech_recognition.py(这是我的主模块atm)通过我的IDE(pyCharm)运行但是当我尝试使用python speech_recognition.py通过终端运行它时,我得到enter image description here

另一件事是我尝试以这种方式访问​​mic_config文件中system_config文件夹中的Configurations文件:

def __init__(self, path = "../Configurations/system_config"):
    with open(path) as json_data:
        self.mic_config = json.load(json_data)
        json_data.close()

我得到以下异常:enter image description here

那我该如何解决这些问题: 1.从其他包导入模块 2.使用相对路径访问文件

谢谢!

1 个答案:

答案 0 :(得分:3)

Re:不存在的文件:

def __init__(self, path = "../Configurations/system_config"):
    with open(path) as json_data:
        self.mic_config = json.load(json_data)
        json_data.close()

当Python打开文件时,它会搜索当前目录中的路径。看起来你期望Python从目录中搜索,模块位于。

典型的解决方案是:

  • 决定从项目根目录运行脚本
  • 假设存在子目录Configurations/system_config
  • 让您的代码从此处打开

然后你的代码看起来像:

def __init__(self, path = "Configurations/system_config"):
    with open(path) as json_data:
        self.mic_config = json.load(json_data)
        json_data.close()

项目的根目录

目前尚不清楚,您的项目在哪里有root权限。如果是Smart Home,那么不清楚,为什么你在这个文件夹__init__.py文件中,它不应该在那里。

如果您的项目主页位于Workspace,那么您会遇到子模块Smart Home中的空格问题。

您的setup.py

在哪里

setup.py是Python项目的典型部分,包含要使用的模块和包。当一个人开始使用Python进行编程时,它通常似乎是不重要的,太复杂的,并且是第一个跳过的候选者。

实际上,setup.py是一种项目元信息,是许多工具(安装程序,IDE,...)的入口点。它允许定义应安装的其他软件包,您的软件包和模块位于何处,提供简短描述。

照顾它,它可能成为你项目的锚点。

导入包的问题

这与两件事有关

  • 开始您的程序
  • 使用setup.py

上面讨论过两者。

典型情况是:

  • 您项目的根位于Smart Home
  • 项目目录中没有__init__.py
  • setup.py添加到项目根目录
  • 让您的IDE了解项目的根目录

如果您cd到项目根目录,您将能够(即使没有setup.py):

  1. 打开python(或更好iPython)控制台
  2. import Parsers
  3. 成功
  4. import Parsers.listener_config
  5. 成功
  6. import SpeechRecognition#mind成功,没有空间,重命名你的目录
  7. import SpeechRecognition.speech_recongintion
  8. 成功

    如果你失败了,你就会有错误的名字,名字中的空格,或者无法加载的代码破碎。

    在何处了解有关setup.py

    的更多信息

    在过去的两年里,这个领域取得了很大的进步,所以你很容易因为过时的信息而感到困惑。

    简单规则:首选使用pip作为命令行工具,使用setuptools作为库来构建软件包。

    两者都安装了另一个很棒的工具virtualenv

    setuptools and distribute got merged大约一年前 - 这是简化混乱的非常重要的一步。所以最好的起点可能是setuptools doc