无法从一个目录导入包

时间:2019-04-24 16:33:10

标签: python import

当尝试从一个目录导入文件时,我似乎无法弄清楚如何解决以下错误,这使我发疯。 Python 3.6.7。

The Internet表示应该完成的操作,其中一个目录向上:

from .. import app

这是错误:

Traceback (most recent call last):
  File "module1.py", line 16, in <module>
    from .. import app
ValueError: attempted relative import beyond top-level package

这是dir结构(应该注意,我是从module1.py内部调用脚本package1的):

--- project/
    --- __init__.py
    --- app.py
    --- package1/
        --- __init__.py
        --- module1.py

这是我试图解决的问题:

方法1 (相同的错误)

import sys

HERE = Path(__file__).parent
sys.path.append(str(HERE / '../'))
from .. import app

方法2 (found here,相同的错误)

import os
import sys

sys.path.append(os.path.join(os.path.dirname(__file__)))
from .. import app

方法3 (也是found here,同样的错误)

import sys

sys.path.append('.')
from .. import app

2 个答案:

答案 0 :(得分:2)

Python的标准包结构如下:

c:\srv\tmp> tree project
project
|-- project
|   |-- __init__.py
|   |-- app.py
|   `-- package1
|       |-- __init__.py
|       `-- module1.py
`-- setup.py

其中项目根目录c:\srv\tmp\project包含一个setup.py文件和一个包含源代码的子目录(也名为project)。

module1.py的内容:

from .. import app

def module1_fn():
    print("In module1, have imported app as:", app)

setup.py的内容:

from setuptools import setup

setup(
    name='project',
    packages=['project'],    # where to find sources
    entry_points={
        'console_scripts': """
            module1-fn = project.package1.module1:module1_fn
        """
    }
)

现在从包含setup.py的目录运行“魔术”部分(注意末尾的.):

c:\srv\tmp\project> pip install -e .
Obtaining file:///C:/srv/tmp/project
Installing collected packages: project
  Running setup.py develop for project
Successfully installed project

现在,您可以从任何目录运行:

c:\srv\tmp\project> module1-fn
In module1, have imported app as: <module 'project.app' from 'c:\srv\tmp\project\project\app.pyc'>

即。 module1-fn可以直接从shell(!)调用,而from .. import app则可以直接(!!)

答案 1 :(得分:1)

我已经在笔记本电脑上工作了,所以希望它也对您有用。

module1.py

import sys
from os import path

sys.path.append(path.join(path.dirname(__file__), '..'))
from app import print_app


print_app()

app.py:

def print_app():
    print('success')
    return None

结果:

$python module1.py 

'success'