Python导入模块1级以上。不使用Sys.path

时间:2017-09-21 21:19:34

标签: python

更新:我更改了我的文件目录

我有一个目录结构如下,我想在父目录中导入一个模块。

**project**/
    __init__.py
    main.py
    **APP_NAME**/
        **parser**/
            __init__.py
            parser.py
    **test**/
        __init__.py
        parser_test.py

parser.py

class Parser(object):
  pass

main.py(工作正常)

from APP_NAME.parser.parser import Parser

parser_test.py(引发错误)

from ..APP_NAME.parser.parser import Parser

在parser_test.py

处抛出以下错误
Parent module '' not loaded, cannot perform relative import

我知道我可以使用sys.path.append()来修复它,但是我想像在main.py中那样将它导入包中。

感谢任何帮助。感谢。

2 个答案:

答案 0 :(得分:-1)

我必须回顾一下我的一个项目以供参考。

要测试tests文件夹中的文件,首先必须创建setup.py,以便安装python项目以便使用它。

如果在linux上使用命令sudo python setup.py install来安装软件包。对项目进行更改后,必须再次安装才能进行更改。

安装后,将在根项目目录中创建这些文件夹。 builddistproject.egg-info

在重新安装更新之前,您可能需要清理构建目录。

python setup.py clean python setup.py build python setup.py install

项目结构

project
├── setup.py
├── tests
│   └── parser_test.py
│    
└── project
    ├── __init__.py
    ├── __init__.pyc
    ├── main.py
    └── parser
        ├── __init__.py
        ├── __init__.pyc
        ├── parser.py
        └── parser.pyc

项目/ setup.py

from setuptools import setup


# Make sure the project name will not conflict with other libraries
# For example do not name the project, 'os', 'sys', ect.

setup(
    name='project', 
    description='My project description',
    author='your_online_name',
    license='MIT', # Check out software licenses
    packages=['project', 'tests']
)

项目/测试/ parser_test.py

from project.parser import Parser

parser = Parser()

项目/项目/ __init__.py

from . import parser

项目/项目/解析器/ __init__.py

from .parser import Parser

项目/项目/解析器/ parser.py

class Parser(object):
    pass

答案 1 :(得分:-1)

您不应该在包中使用绝对导入。包装内进口应采用相对进口方式:

parser_test.py

project/parser/parser.py

使用Python中的相对导入,第一个点指的是文件的目录,每个额外的点指的是父目录。

在这种情况下,您将指向来自test_parser.py立场../parser.py

parser文件

如果您使用的是Python 2,则应在from __future__ import absolute_import 包中的所有文件的顶部添加以下行

unicode_literals

这样可以避免错误地在包文件中使用绝对导入。

仍然假设您正在使用Python 2,您还应该导入print_function以获取本机unicode支持,并导入print以使用print()函数替换project/ # top project directory ├── main.py └── project # top package directory ├── __init__.py # this file is required even if it is empty ├── parser │   ├── __init__.py │   └── parser.py └── tests └── test_parser.py 命令。 / p>

但是,我宁愿在的顶层文件夹中进行测试,假设包名为 project 而不是解析器,则会提供以下目录结构:

project/project/parser/__init__.py

此外,from .parser import Parser 可能包含以下内容:

main.py

这样您的Parser文件就可以像这样导入from project.parser import Parser 类:

from project.parser.parser import Parser

而不是更乏味:

test_parser.py

但是,您的Parser文件仍然必须导入from ..parser.parser import Parser 类,如下所示:

__init__.py

因为from __future__文件中公开的类不可用于相对导入。

最后,如果你要开始一个新的独立项目,你应该在Python 3(这是一个PEP推荐)中做到这一点,其中所有上述规则都适用,除了sudo docker rm --force container_name 导入是不必要的。

资料来源:https://axialcorps.wordpress.com/2013/08/29/5-simple-rules-for-building-great-python-packages/