更新:我更改了我的文件目录
我有一个目录结构如下,我想在父目录中导入一个模块。
**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中那样将它导入包中。
感谢任何帮助。感谢。
答案 0 :(得分:-1)
我必须回顾一下我的一个项目以供参考。
要测试tests
文件夹中的文件,首先必须创建setup.py
,以便安装python项目以便使用它。
如果在linux上使用命令sudo python setup.py install
来安装软件包。对项目进行更改后,必须再次安装才能进行更改。
安装后,将在根项目目录中创建这些文件夹。
build
,dist
和project.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/