在目录之间导入模块 [英] Importing Module Between Directories

查看:16
本文介绍了在目录之间导入模块的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

更新(以显示最终代码)

因为这似乎很难解释,我分享了这个项目。对于那些遇到这个问题的人,您可以在此处查看完整的项目:

https://github.com/jeffnyman/pacumen

调出对我有问题的文件:

Graphical_Pacman

https://github.com/jeffnyman/pacumen/blob/master/displays/graphical_pacman.py

布局

https://github.com/jeffnyman/pacumen/blob/master/mechanics/layout.py

准备好__init__.pysetup.py文件后,我现在可以运行如下命令:

python displays/graphical_pacman.py

python mechanics/layout.py

现在,当执行这些命令时,所有导入都可以正确解析。您可以看到我在每个文件中使用的所有导入语句以及各种__init__.py文件的位置。

原始问题

我做不到一件看似简单的事情:在目录之间导入模块。这些都是在Python3中实现的,所以我不想把__init__.py文件弄得到处都是,如果我能帮上忙的话,这里的许多答案都表明这是"正确"的方式。

我有一个这样的结构:

project
  displays
    graphical_pacman.py
  mechanics
    layout.py

layout.py文件有一个名为Get_Layout()的顶级函数,我希望从GRAPHICAL_pacman.py调用该函数。

转到所需的最低代码,在GRAPHICAL_PACMAN.py中:

import layout

if __name__ == '__main__':
  board = layout.get_layout("test_maze.lay")

在IDE中显示得很好,甚至为我自动完成它。运行GRAPHICAL_PACMAN.PY会得到以下结果:

File "displays/graphical_pacman.py", line 3, in <module>
  import layout
ModuleNotFoundError: No module named 'layout'

然后我尝试了一下:

from mechanics.layout import get_layout

if __name__ == '__main__':
  board = mechanics.layout.get_layout("test_maze.lay")

也不能这样做:

File "displays/graphical_pacman.py", line 3, in <module>
  from mechanics.layout import get_layout
ModuleNotFoundError: No module named 'mechanics'

我尝试过:

from mechanics import layout

if __name__ == '__main__':
  board = layout.get_layout("test_maze.lay")

我尝试过:

from layout import get_layout

if __name__ == '__main__':
  board = get_layout("test_maze.lay")

不起作用。收到此消息:

File "displays/graphical_pacman.py", line 3, in <module>
  from layout import get_layout
ModuleNotFoundError: No module named 'layout'

我尝试使用相对导入(与.在事物面前),但这也不起作用。我还尝试使用*进行导入(实质上是导入所有内容)。也不管用。当我说"不起作用"时,我得到了上述错误的一些变体。

displays目录中和根project目录中运行python graphical_pacman.py命令,我已经尝试了所有这些方法。每次都会出现相同的错误。

我还尝试使用sys.path,如sys.path.insert(0, '../mechanics')。我还尝试了基于我在这里看到的其他答案的sys.path.append('../')的变体。同样,我得到的都是上述错误的变体。

我错过了什么?

推荐答案

第二次更新: 我已发送拉取请求,请查看。
下面是我所做的:我在项目根目录之外创建了一个包,并使用pip安装了它。详情如下:

添加的文件:

pacumen
    __init__.py
    setup.py
    displays
        __init__.py
    library
        __init__.py
    mechanics
         __init__.py

Pacumen/__init__.py:

from . import displays
from . import library
from . import mechanics

pacumen/setup.py的内容:

import setuptools


setuptools.setup(
    name='pacumen',
    version='0.01dev',
    packages=['displays',
                'library',    
                'mechanics',
            ],
    author='jefferyman',
    author_email='something@something.com',
    description='Pacman. Duh.',
    long_description=open('README.md').read(),        
    )

包装/显示内容/__init__.py:

from . import graphical_helpers
from . import graphical_pacman
from . import graphical_support

包/库/__init__.py:

from . import structures
from . import utilities

包装/机械/__init__.py:

内容
from . import grid
from . import layout

文件更改:

PACUMEN/MECHANILES/layout.py:

from mechanics.grid import Grid
确保您的虚拟环境处于活动状态。(进一步向下说明)。
最后,导航到项目根目录并以包的形式安装项目根目录:

pip install --editable .  # or pip install -e .  (Note the  period at the end)
现在,只要您激活了虚拟环境,您应该不会有任何导入问题。请确保使用以下样式的导入语句:

from mechanics.grid import Grid

虚拟环境创建和激活:

对于读者来说,现在是创建虚拟环境的好时机如果还没有创建虚拟环境的话。如果是这样的话,一定要激活它。如果没有,请导航到项目目录(Paumen)的根目录,然后运行

$ python -m venv venvdir

然后,在创建后,运行:

<project-root>$ .venvdirScriptsactivate  # for windows.
OR
<project-root>$ source venvdir/bin/activate  # for linux bash

更新:首先要检查的是没有循环导入,这意味着您正在从GRAPHICAL_PACMAN中导入一些GRAPHICAL_PACMAN中的内容,并从GRAPHICAL_PACMAN中导入其他力学中的内容。另外,请确保您的模块名称不会与内置的python模块名称冲突。如果这些方面都很好,

  1. 您试过了吗?
    from project.mechanics import layout
  2. 如果不起作用,请在项目、显示、机械中放置__init__.py文件。
    在项目/显示/__init__.py中添加from . import graphical_pacman
    在项目/机械/__init__.py中添加from. import layout
  3. 如果这两种方法都不起作用,请使用pip install -e .
  4. 创建一个包,导航到包根目录并将其安装在您的环境中

这篇关于在目录之间导入模块的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆