首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >无法从上一个目录导入包

无法从上一个目录导入包
EN

Stack Overflow用户
提问于 2019-04-25 00:33:10
回答 2查看 128关注 0票数 1

当我试图从一个目录导入一个文件时,我似乎不知道如何修复下面的错误,这让我发疯。Python 3.6.7。

下面是The Internet所说的应该怎么做,一个目录:

代码语言:javascript
复制
from .. import app

下面是错误:

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

下面是目录结构(需要注意的是,我是在package1内部调用脚本module1.py ):

代码语言:javascript
复制
--- project/
    --- __init__.py
    --- app.py
    --- package1/
        --- __init__.py
        --- module1.py

以下是我试图解决的问题:

方法1 (相同错误)

代码语言:javascript
复制
import sys

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

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

代码语言:javascript
复制
import os
import sys

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

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

代码语言:javascript
复制
import sys

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

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-25 01:05:55

我在我的笔记本电脑上实现了这个功能,所以我希望它也能在你的电脑上运行。

模块1.py

代码语言:javascript
复制
import sys
from os import path

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


print_app()

app.py:

代码语言:javascript
复制
def print_app():
    print('success')
    return None

结果:

代码语言:javascript
复制
$python module1.py 

'success'
票数 1
EN

Stack Overflow用户

发布于 2019-04-25 03:33:03

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

代码语言:javascript
复制
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的内容

代码语言:javascript
复制
from .. import app

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

setup.py的内容

代码语言:javascript
复制
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的目录中运行(注意末尾的. ):

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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可以直接从外壳(!)调用,from .. import app直接工作(!!)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55834762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档