Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python3:导入同名的不同Python模块_Python_Python 3.x - Fatal编程技术网

Python3:导入同名的不同Python模块

Python3:导入同名的不同Python模块,python,python-3.x,Python,Python 3.x,我有几个python项目(例如a、b),它们是彼此独立编写的。我想创建第三个项目(c),它使用这两个项目的例程,而不会对(a,b)的主要内容进行太多更改 如果(a.py,b.py)在各自的项目文件夹中被调用时仍能工作,则可以对(a,b)中的导入语句进行细微更改 问题有点类似于前一篇文章(),但: 我使用的是Python3,因此相对导入的工作方式似乎有所不同 我想知道如何替换行“from utils import*”,如下例所示 我在当前工作目录下有另一个utils.py,它隐藏着项目a和b中的其

我有几个python项目(例如a、b),它们是彼此独立编写的。我想创建第三个项目(c),它使用这两个项目的例程,而不会对(a,b)的主要内容进行太多更改

如果(a.py,b.py)在各自的项目文件夹中被调用时仍能工作,则可以对(a,b)中的导入语句进行细微更改

问题有点类似于前一篇文章(),但:

  • 我使用的是Python3,因此相对导入的工作方式似乎有所不同

  • 我想知道如何替换行“from utils import*”,如下例所示

  • 我在当前工作目录下有另一个utils.py,它隐藏着项目a和b中的其他utils.py


  • 例如,我的项目如下所示:

    • a
      • a、 派克
      • utils.py
    • b
      • b、 派克
      • utils.py
    • c
      • main.py
      • utils.py
    a/a.py的内容:

    import utils
    utils.hello()
    
    a/utils.py的内容:

    def hello():
        print('hello from a')
    
    def hello():
    print('hello from b')
    
    b/b.py的内容:

    from utils import *
    hello()
    
    b/utils.py的内容:

    def hello():
        print('hello from a')
    
    def hello():
    print('hello from b')
    
    main.py的内容

    import sys
    sys.path.append('../a')
    import a
    sys.path.append('../b')
    import b
    import utils
    
    utils.hello()
    
    示例打印(我希望这三行分别打印a、b、c):



    在我看来,
    sys.path.insert
    sys.append
    导入模块不是很好的做法,而且随着项目规模的扩大,可能会使项目容易出现bug。

    向每个文件夹a和b添加一个名为
    的空文件。这会将这些文件夹标记为包。
    然后(将文件夹添加到路径后),您应该能够将a导入为
    import a.a
    ,如果需要,您可以将a的
    utils.py
    导入为
    import a.utils

    我使用的是Python3,因此相对导入不再有效

    不知道你为什么会得出这个结论,但是:

    在a.py中:

    from .utils import hello # the . is important!
    hello()
    
    (类似于b.py和c.py)

    打印所需的输出

    请注意,python 3中的相对导入需要来自的
    。。。导入…
    语法


    编辑: 如果
    main.py
    位于
    c/
    中,则需要更改导入路径,因为相对导入不能位于启动python的工作目录之上(这就是为什么在
    c
    中导入
    a
    b
    时会出错的原因)

    您可以更改env var
    PYTHONPATH
    (请参阅),也可以在
    main.py
    中执行此操作:

    import sys
    sys.path.append('..')
    import b.b # no more errors!
    
    import utils
    utils.hello()
    
    import a.a
    import b.b
    
    import utils
    utils.hello()
    

    请注意,您仍然需要
    a.py
    b.py
    main.py
    中的
    utils
    的相对导入,我认为您应该使用
    PYTHONPATH
    变量,以避免使用
    sys

    a/a.py
    b/b.py
    的内容:

    import sys
    sys.path.append('..')
    import b.b # no more errors!
    
    import utils
    utils.hello()
    
    import a.a
    import b.b
    
    import utils
    utils.hello()
    
    X/utils.py
    的内容,带有
    X
    其中一个
    a
    b
    c

    def hello():
        print('hello from X')
    
    c/main.py的内容

    import sys
    sys.path.append('..')
    import b.b # no more errors!
    
    import utils
    utils.hello()
    
    import a.a
    import b.b
    
    import utils
    utils.hello()
    
    输出(运行时:
    export PYTHONPATH='$PYTHONPATH:';python main.py
    ):

    你好,来自
    b你好
    你好,c
    
    或者,更确切地说,我只是测试了它,我可以确认
    \uuu init\uuuuuuuuuy.py
    文件在python 3中不是必需的。这给了我一个错误
    导入错误:尝试在没有已知父包的情况下进行相对导入
    如果在控制台中键入,相对导入将不起作用。将其写入
    a.py
    ,然后从控制台导入
    a
    我将
    from.utils import hello
    放入
    a.py
    b.py
    并在目录
    c
    中从终端执行main.py。哦,我没有看到
    main
    c//code>中,我将我的放在根目录中。让我测试这个配置