Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python配置文件_Python_Python 2.7 - Fatal编程技术网

Python配置文件

Python配置文件,python,python-2.7,Python,Python 2.7,我正在从事一个python项目,其目录结构如下所示 SEC-Edgar ├── SECEdgar │   ├── __init__.py │   ├── companylist.txt │   ├── crawler.py │   ├── crawler.pyc │   ├── data.txt │   └── test.py ├── config.py ├── requirements.txt └── setup.py 我试图在crawler.py中使用配置模块,但它给出了一个ImportE

我正在从事一个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
我无法理解导入在python中是如何工作的,特别是当涉及到不同的目录时,比如从根目录导入到基目录

我是否也需要在根目录上添加
\uuuu init\uuuuuuuuuuupy
,以便它成为一个包,然后使用
导入它


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

首先将
从config import DEFAULT\u DATA\u PATH更改为
from..config import DEFAULT\u DATA\u PATH
,然后在
SEC Edgar
目录中添加一个空的
\u init\uuuuuuuuuuuu.py

然后,尝试以python-msecedgar.SECEdgar.test的形式执行模块,或者从存在SECEdgar的位置(目录)对正在运行的任何模块执行类似的操作

这里有三件事需要注意

  • 您的
    config.py
    crawler.py
    模块不共享同一父目录。因此,当您尝试从配置导入默认数据路径时,
    crawler.py
    Python无法为您导入它
  • 只有当python中的其他目录是包时,我们才能从该目录导入模块(.py文件)。只需在该目录中添加一个空的
    \uuuu init\uuuu.py
    文件即可
  • 我们现在可以使用相对进口。但是,在相对导入期间,Python使用模块的
    \uuuu name\uuuu
    属性,如下所示:
  • 相对导入使用模块的名称属性来确定 模块在包层次结构中的位置。如果模块的名称为 不包含任何程序包信息(例如,它被设置为“main”) 然后解析相对导入,就好像模块是顶层一样 模块,而不管模块在文件中的实际位置 系统

    因此,我们使用
    -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"
    
    from ..config import DEFAULT_DATA_PATH
    
    SecCrawler = "Lets assume I'm an SecCrawler"
    
    from crawler import SecCrawler
    
    print(SecCrawler)
    
    crawler.py

    DEFAULT_DATA_PATH = "some/path"
    
    from ..config import DEFAULT_DATA_PATH
    
    SecCrawler = "Lets assume I'm an SecCrawler"
    
    from crawler import SecCrawler
    
    print(SecCrawler)
    
    test.py

    DEFAULT_DATA_PATH = "some/path"
    
    from ..config import DEFAULT_DATA_PATH
    
    SecCrawler = "Lets assume I'm an SecCrawler"
    
    from crawler import SecCrawler
    
    print(SecCrawler)
    

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

    然后,尝试以python-msecedgar.SECEdgar.test的形式执行模块,或者从存在SECEdgar的位置(目录)对正在运行的任何模块执行类似的操作

    这里有三件事需要注意

  • 您的
    config.py
    crawler.py
    模块不共享同一父目录。因此,当您尝试从配置导入默认数据路径时,
    crawler.py
    Python无法为您导入它
  • 只有当python中的其他目录是包时,我们才能从该目录导入模块(.py文件)。只需在该目录中添加一个空的
    \uuuu init\uuuu.py
    文件即可
  • 我们现在可以使用相对进口。但是,在相对导入期间,Python使用模块的
    \uuuu name\uuuu
    属性,如下所示:
  • 相对导入使用模块的名称属性来确定 模块在包层次结构中的位置。如果模块的名称为 不包含任何程序包信息(例如,它被设置为“main”) 然后解析相对导入,就好像模块是顶层一样 模块,而不管模块在文件中的实际位置 系统

    因此,我们使用
    -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"
    
    from ..config import DEFAULT_DATA_PATH
    
    SecCrawler = "Lets assume I'm an SecCrawler"
    
    from crawler import SecCrawler
    
    print(SecCrawler)
    
    crawler.py

    DEFAULT_DATA_PATH = "some/path"
    
    from ..config import DEFAULT_DATA_PATH
    
    SecCrawler = "Lets assume I'm an SecCrawler"
    
    from crawler import SecCrawler
    
    print(SecCrawler)
    
    test.py

    DEFAULT_DATA_PATH = "some/path"
    
    from ..config import DEFAULT_DATA_PATH
    
    SecCrawler = "Lets assume I'm an SecCrawler"
    
    from crawler import SecCrawler
    
    print(SecCrawler)
    

    从..配置导入默认数据路径使用
    from

    参考:

    如果出现错误:
    尝试在非包中进行相对导入


    请参阅:

    从..配置导入默认数据路径使用

    参考:

    如果出现错误:
    尝试在非包中进行相对导入


    请参阅:

    您的代码正常,问题是由以下原因引起的

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

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

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

    if __name__ == '__main__':
        import sys
        print(sys.path)
    
        from config import DEFAULT_DATA_PATH
        print 'DEFAULT_DATA_PATH=%s' % DEFAULT_DATA_PATH
    
  • print(sys.path)
    将向您显示python路径。您可能无法在路径中找到项目根
  • 如果明确需要管理python路径,可以在IDE中配置它。e、 我正在使用pycharm,我将在设置/项目结构中,在运行/调试配置中选中“将源根添加到PYTHONPATH”
  • 配置后,重新运行
    crawler.py
    ,输出将与以下内容相同:
    
    ['C:\\dev\\projects\\SEC Edgar\\SECEdgar',…'C:\\dev\\projects\\SEC Edgar'.]
    默认数据路径=测试
    
    TEST
    将是SEC Edgar\config.py中的值

  • 这仅适用于开发人员,对于打包/部署,您需要正确配置setup.py。您可以参考:

    您的代码很好,问题是由

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

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

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

    if __name__ == '__main__':
        import sys
        print(sys.path)
    
        from config import DEFAULT_DATA_PATH
        print 'DEFAULT_DATA_PATH=%s' % DEFAULT_DATA_PATH
    
  • print(sys.path)
    将向您显示python路径。您可能无法在路径中找到项目根
  • 如果您清楚需要管理python路径,您可以