无法从一个目录导入包

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (36)

在尝试从一个目录导入文件时,我似乎无法弄清楚如何修复下面的错误,这让我很疯狂。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 (在此处找到,相同的错误)

import os
import sys

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

方法3(也在这里找到,相同的错误)

import sys

sys.path.append('.')
from .. import app
提问于
用户回答回答于

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'
用户回答回答于

Python的标准包结构如下所示:

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

其中project-root 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.pyrun 的目录开始(注意.最后):

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直接工作(!!)

扫码关注云+社区

领取腾讯云代金券