【问题标题】:Python import different results from different filesPython从不同的文件导入不同的结果
【发布时间】:2020-01-13 10:19:19
【问题描述】:

我有 2 个相同文件: a.pyb.py

它们都包含该行

from mypackage.utils import common

我还有一个包裹:

mypackage/  
    __init__.py
    mymodule.py
    utils/ 
        __init__.py
        common.py
        myutils1.py
        b.py
    data_classes/ 
        __init__.py
        command_file.py
        myclass.py

我初步做了一个 pip install mypackage

然后我运行: python a.py 成功了

然后我跑 python b.py(注意 b.py 是 mypackage 中的一个文件)

b.py 以 no module named utils 失败

有什么想法吗?

(注意:我对 stackoverflow 还很陌生,这与 Python modules import fails ,虽然不知何故是一个后续问题,所以如果我通过提出一个新问题来做错了什么,请告诉我:)


编辑:

我将 mypackage(特别是 mypackage 中的文件 b)安装在:

$HOME\github\mypackage\mypackage\utils\b.py

我将 b.py 复制到 a.py 中: $HOME\github\mypackage 这行得通

我将 b.py 复制到 a.py 中: $首页\github\ 这不起作用

所以这在某种程度上解释了这一点......虽然我仍然不知道如何解决它!


编辑: 我从以下行编辑了 setup.py:

packages=['mypackage'],

packages=['mypackage','mypackage.data_classes','mypackage.utils']

这似乎解决了我的问题:现在一切正常。

我有什么理由不应该这样做吗?

【问题讨论】:

  • 能否添加运行python a.pypython b.py 的路径?
  • 谢谢 JRajan,我意识到这不仅仅是一个问题:D 我编辑了我的问题以反映你在那里所说的话......我仍然不明白如何解决这个问题......

标签: python python-3.x import module


【解决方案1】:

我找到了几个解决方案:

import common

import sys
sys.path.append("..\\..") # relative path to mypackage, check the slash if you're on linux
from mypackage.utils import common

一些问题:

你为什么要移动 b.py?

你安装了你的包吗?

【讨论】:

    【解决方案2】:

    问题在于 Python 最初不知道在哪里可以找到您的包。在第一个解释中,它查看当前目录并且能够理解它是一个模块,这要感谢您的__init__.py 文件。因此它能够搜索您的实用程序。

    在第二个示例中,当前目录中没有 __init__.py 文件,因此 Python 不知道在哪里搜索模块。

    PYTHONPATH 变量告诉 Python 目录/模块以搜索访问的方法/包。

    因此,在您的情况下,如果您可以在“$HOME\github\”中将当前目录添加到export PYTHONPATH=$(pwd)export PYTHONPATH=$(pwd),那应该有助于解决您的问题。

    P.S:OP 想要使用已安装的包而不是本地模块。当您的本地模块对 Python 解释器不可见时,此解决方案适用。有关更多详细信息,请查看下面的 cmets。

    【讨论】:

    • sorry... not 100% clear //// 所以你的意思是,如果我在运行 b.py 之前安装 mypackage (或“错误”中的 a.py “ 文件夹) ? //// 就像我运行它们时系统不知道我安装了什么包?
    • 如果您尝试使用已安装的软件包,那么我的解决方案不适合您。您可以使用setuptools.find_packages(),而不是手动指定包。
    【解决方案3】:

    我从以下行编辑了 setup.py:

    packages=['mypackage'],

    packages=['mypackage','mypackage.data_classes','mypackage.utils']

    这似乎解决了我的问题:现在一切正常。

    我有什么理由不应该这样做吗?

    【讨论】:

    • 这没关系,唯一不同的方法是使用setuptools;正如你所看到的,他的一个关键特性正是 “自动将所有包包含在你的源代码树中,而不是在 setup.py 中单独列出它们”
    猜你喜欢
    • 1970-01-01
    • 2019-12-30
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多