【问题标题】:Import python module from different folder从不同的文件夹导入 python 模块
【发布时间】:2022-02-03 01:30:19
【问题描述】:

我有一个包含不同文件夹的解决方案,我想为它们创建一个通用包以共享可重用代码。 python packages 有很多例子。它们都没有以简单的方式解决单独的文件夹场景。

我的文件夹结构是:

Client/
    __init__.py
    --logic.py
Common/
    __init__.py
    -- Constants.py
Server/
    __init__.py
    -- Test.py

我的Test.py 看起来像这样:

from Common import Constant        
print(Constant.TEST_VALUE)  #-- From common package

但代码甚至没有通过import 语句。

Exception has occurred: ModuleNotFoundError No module named 'Common'

如果我尝试使用相对路径:from ..Common import Constant

错误:

Exception has occurred: ImportError attempted relative import with no known parent package

我的目的是为CarsServer 解决方案重用constant.py 文件。 sys.path 有一些示例,我不确定它是否是一个好习惯。此外,Common 中的代码不会有复杂的代码来继续安装它们。

【问题讨论】:

  • "我想在Test.py 中使用Common 模块和Cars 模块-那些不是模块;他们是包裹。 “它们都没有以简单的方式解决单独的文件夹场景。”正确的;通常一个项目有一个顶级包。简单的解决方案是只制作一个包含其他三个文件夹的文件夹,然后按照通常的建议进行操作。如果您确实想要相互交互的单独包,那么最简单的方法是安装它们(最好是在虚拟环境中)。
  • "OR PATH 用于指定模块的路径。"我想你的意思是PYTHONPATH。我一般不建议这样做。
  • @Karl 在我的情况下,这就像一个客户端-服务器拱门。一种解决方案是 Cars+Common,另一种是 Server+Common。我来自 .NET 背景,这就是为什么会出现这些错误。
  • 啊哈,所以有些用户会特别想要两个而不是全部三个包?然后我想你的解决方案中确实有三个项目(在 VS 中),其中 Cars 和 Server 都依赖于 Common。最好将它们视为单独的包,因此在它们之间使用绝对导入。

标签: python package python-import


【解决方案1】:

如果这些包是同一个概念项目的一部分,那么只需制作一个包含包。现在相对导入将起作用as long as you start from outside the package hierarchy, and ensure the containing folder is on sys.path。简单的方法是安装包(最好安装到虚拟环境),或从该文件夹启动 python(在这种情况下,CarsCommonServer 显示为单独的包)或就在外面(在这种情况下,包含文件夹是一个包,CarsCommonServer 是子包 - 这可能是您想要的;它与您以后很可能安装代码的方式更加一致)。

如果这些包是碰巧相互依赖的独立项目,那么默认情况下 Python 没有理由在任何特定位置查找依赖包 - 除了它通常查找的位置任何事物。因此,同样,如果确实存在这样的包含文件夹,您可以从包含文件夹中启动 python;但是没有一个很好的项目组织理由来包含一个包含文件夹 - 因此为每个包设置一个实际项目,并将它们全部安装到相同的虚拟环境中。现在您可以使用绝对语法(但不能使用相对语法,因为这只适用于包层次结构)进行跨包导入。

【讨论】:

  • 我假设在你提到的之前的研究中,你看到了如何设置安装包,并安装它们。如果没有,this 是权威参考,直接来自 python.org。
【解决方案2】:

您可以使用here找到的此代码:

# Test.py
import sys
# insert at 1, 0 is the script path (or '' in REPL)
sys.path.insert(1, '/path/to/Cars/')
sys.path.insert(1, '/path/to/Common/')

import Audi
import Constants

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 2013-08-26
    • 1970-01-01
    • 2018-08-08
    • 2019-02-11
    相关资源
    最近更新 更多