【问题标题】:Python config ImportErrorPython 配置 ImportError
【发布时间】:2016-05-03 08:48:53
【问题描述】:

我正在做一个python项目,它的目录结构是这样的,

SEC-Edgar
├── SECEdgar
│   ├── __init__.py
│   ├── companylist.txt
│   ├── crawler.py
│   ├── crawler.pyc
│   ├── data.txt
│   └── test.py
├── config.py
├── requirements.txt
└── setup.py

我正在尝试在crawler.py 中使用配置模块,但它给出了ImportError

Traceback (most recent call last):
  File "SECEdgar/test.py", line 3, in <module>
    from crawler import SecCrawler
  File "/Users/rahul/Code/SEC-Edgar/SECEdgar/crawler.py", line 9, in <module>
    from config import DEFAULT_DATA_PATH
ImportError: No module named config

crawler.py中的import语句是

 from config import DEFAULT_DATA_PATH

我无法理解导入在 python 中的工作原理,尤其是涉及不同目录时,例如从根目录导入到基目录。

我是否需要在根目录也添加__init__.py,使其成为一个包,然后使用. 导入它?

有没有更好的方法来处理导入,或者我在这里缺少一些基础知识?

【问题讨论】:

  • SEC-Edgar 是否存在于您的 PYTHONPATH 中?
  • 也许可以试试from ../config import DEFAULT_DATA_PATH
  • 我认为您必须将您的 SEC-Edgar 目录重命名为例如SEC_Edgar 因为模块名称必须遵循 Python 命名限制,它只允许字母数字字符加上下划线。这并使用相对导入。

标签: python python-2.7


【解决方案1】:

使用from ..config import DEFAULT_DATA_PATH

参考:Intra-package References

如果出现错误:Attempted relative import in non-package

参考:this question

【讨论】:

  • 我收到值错误Traceback (most recent call last): File "crawler.py", line 9, in &lt;module&gt; from ..config import DEFAULT_DATA_PATH ValueError: Attempted relative import in non-package
  • 在父文件夹中创建文件__init__.py
  • 我已经创建了它,但仍然出现错误。
【解决方案2】:

首先将from config import DEFAULT_DATA_PATH更改为from ..config import DEFAULT_DATA_PATH,然后在SEC-Edgar目录中添加一个空的__init__.py

然后,尝试从 SEC-Edgar 所在的位置(目录)以 python -m SEC-Edgar.SECEdgar.test 或类似的方式执行您正在运行的任何模块。

这里需要注意三点。

  1. 您的config.pycrawler.py 模块不共享同一个父目录。因此,当您从 crawler.py 尝试 from config import DEFAULT_DATA_PATH 时,Python 无法为您导入它。
  2. 只有当该目录是一个包时,我们才能从 python 中的其他目录导入模块(.py 文件)。只需在该目录中添加一个空的__init__.py 文件即可完成。
  3. 我们现在可以使用相对导入。但是,在相对导入期间,Python 使用模块的__name__ 属性,根据PEP 328

相对导入使用模块的 name 属性来确定 模块在包层次结构中的位置。如果模块的名称 不包含任何包信息(例如,它设置为 'ma​​in') 然后解析相对导入,就好像模块是顶级的 模块,无论模块实际位于文件的哪个位置 系统。

因此,我们使用 -m 选项运行它,以提供 Python 执行相对导入的包信息。

[回应评论] 这对我有用,

SEC-Edgar
├── SECEdgar
│   ├── __init__.py
│   ├── crawler.py
│   └── test.py
├── __init__.py
└── config.py

我在 SEC-Edgar 目录之外,

C:\Users\username\Documents> ls
SEC-EDGAR  OTHERS

C:\Users\username\Documents> python -m SEC-Edgar.SECEdgar.test
Lets assume I'm an SecCrawler

config.py

DEFAULT_DATA_PATH = "some/path"

crawler.py

from ..config import DEFAULT_DATA_PATH

SecCrawler = "Lets assume I'm an SecCrawler"

test.py

from crawler import SecCrawler

print(SecCrawler)

【讨论】:

  • config 更改为..config 不起作用。唯一有效的解决方案是将项目路径添加到PYTHONPATH
  • 是的,将项目路径添加到 PYTHONPATH 将起作用,但是您在移动项目时添加了路径,这不是正确的方法。 stackoverflow.com/a/19669773/887007
【解决方案3】:

您的代码很好,问题是由Python path 引起的。

尝试回答这个问题: python如何/在哪里可以找到名为'config'的模块?

所以,我建议你找到这些步骤来理解和解决问题:

  1. 缩小范围 在你的 crawler.py 中,使用这个 main:

    if __name__ == '__main__':
        import sys
        print(sys.path)
    
        from config import DEFAULT_DATA_PATH
        print 'DEFAULT_DATA_PATH=%s' % DEFAULT_DATA_PATH
    
  2. print(sys.path) 将显示 python 路径。您可能无法在路径中找到您的项目根目录。
  3. 如果您明确需要管理 python 路径,您可以在 IDE 中配置它。例如我正在使用 pycharm,我将在设置/项目结构中 select the source root 并在运行/调试配置中检查“将源根添加到 PYTHONPATH”。
  4. 配置完成后,重新运行crawler.py,输出将类似于: ['C:\\dev\\projects\\SEC-Edgar\\SECEdgar', ... 'C:\\dev\\projects\\SEC-Edgar'.] DEFAULT_DATA_PATH=TEST TEST 将是 SEC-Edgar\config.py 中的值

这仅适用于开发,对于打包/部署,您需要正确配置 setup.py。您可以参考:https://docs.python.org/2/distutils/setupscript.html

【讨论】:

    猜你喜欢
    • 2015-08-25
    • 2020-05-26
    • 2015-08-08
    • 2015-10-22
    • 1970-01-01
    • 2015-01-20
    • 2017-09-05
    • 2013-04-17
    • 2019-04-03
    相关资源
    最近更新 更多