Python配置导入

2024-05-02 03:27:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我在做一个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,以便它成为一个包,然后使用.导入它?

有没有更好的方法来处理进口,或者我在这里遗漏了一些基本知识?


Tags: frompytestimport目录txtconfiginit
3条回答

首先将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.pyfrom config import DEFAULT_DATA_PATH时,Python无法为您导入它。
  2. 只有当python中的其他目录是一个包时,我们才能从该目录导入模块(.py文件)。只需在该目录中添加一个空的__init__.py文件就可以完成。
  3. 我们现在可以使用相对进口。但是,在相对导入期间,Python根据PEP 328使用模块的__name__属性:

Relative imports use a module's name attribute to determine that module's position in the package hierarchy. If the module's name does not contain any package information (e.g. it is set to 'main') then relative imports are resolved as if the module were a top level module, regardless of where the module is actually located on the file system.

因此,我们使用-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

配置py

DEFAULT_DATA_PATH = "some/path"

爬虫程序.py

from ..config import DEFAULT_DATA_PATH

SecCrawler = "Lets assume I'm an SecCrawler"

测试.py

from crawler import SecCrawler

print(SecCrawler)

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

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

因此,我建议您找到以下步骤来理解和解决问题:

  1. 缩小范围 在crawler.py中,使用以下主:

    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中对其进行配置。e、 g.我正在使用pycharm,我将在settings/Project Structure中select the source root,并在Run/Debug配置中检查'Add source roots to PYTHONPATH'。
  4. 配置后,重新运行crawler.py,输出将如下所示: ['C:\\dev\\projects\\SEC-Edgar\\SECEdgar', ... 'C:\\dev\\projects\\SEC-Edgar'.] DEFAULT_DATA_PATH=TEST TEST将是SEC Edgar\config.py中的值

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

使用from ..config import DEFAULT_DATA_PATH

参考:Intra-package References

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

参考:this question

相关问题 更多 >