我在macOS Mojave版本10.14.1上使用Python 3.7.1

这是我的目录 struct :

man/                          
  Mans/                  
          man1.py
  MansTest/
          SoftLib/
                  Soft/
                      SoftWork/
                              manModules.py
          Unittests/
                    man1test.py

man1.py包含以下import语句which I do not want to change:

from Soft.SoftWork.manModules import *

man1test.py包含以下import条语句:

from ...MansTest.SoftLib import Soft
from ...Mans import man1

我需要man1test.py中的第二个import,因为man1test.py需要访问man1.py中的一个函数.

我第一次导入(Soft)的基本原理是在man1.py中促进前面提到的import语句.

然而,与我的预期相反,man1.py分之import的声明产生了:

ModuleNotFoundError: No module named 'Soft'

当我跑的时候

python3 -m man.MansTest.Unittests.man1test

man/以上的目录.

有没有办法解决这个错误,而不改变man1.py and中的import语句,而不向sys.path添加任何内容?

编辑:python3 -m man.ManTest.Unittests.man1test从原来的问题改为python3 -m man.MansTest.Unittests.man1test

推荐答案

FIRST,如果你想从男人测试.py访问man1.py,从man1.py访问载人模块.py,你需要正确地将你的文件设置为packages and modules.

包是通过使用

...

导入包时,Python会在

__init__.py个文件是Python处理

您需要将其设置为以下内容:

man
|- __init__.py
|- Mans
   |- __init__.py
   |- man1.py
|- MansTest
   |- __init.__.py
   |- SoftLib
      |- Soft
         |- __init__.py
         |- SoftWork
            |- __init__.py
            |- 载人模块.py
      |- Unittests
         |- __init__.py
         |- 男人测试.py

SECOND,对于男人测试.py中的from ...Mans import man1导致的"ModuleNotFoundError: No module named 'Soft'"错误,记录在案的解决方案是将man1.py添加到sys.path,因为MansMansTest包之外.请参阅Python文档中的The Module Search Path.但如果不想直接修改sys.path,也可以修改PYTHONPATH:

sys.path从以下位置初始化:

  • 包含输入脚本的目录(或未指定文件时的当前目录).
  • PYTHONPATH(目录名列表,语法与shell变量PATH相同).
  • 依赖于安装的默认设置.

THIRD,对于from ...MansTest.SoftLib import Soft,你说的是"was to facilitate the aforementioned import statement in man1.py",这就是进口的工作原理.如果你想在man1.py中导入Soft.SoftLib,你必须设置man1.py来找到Soft.SoftLib并直接导入.

话虽如此,我还是这么做的.

男1.py:

from Soft.SoftWork.manModules import *
# no change to import statement but need to add Soft to PYTHONPATH

def foo():
    print("called foo in man1.py")
    print("foo call module1 from manModules: " + module1())

男人测试.py

# no need for "from ...MansTest.SoftLib import Soft" to facilitate importing..
from ...Mans import man1

man1.foo()

载人模块.py

def module1():
    return "module1 in manModules"

终端输出:

$ python3 -m man.MansTest.Unittests.man1test
Traceback (most recent call last):
  ...
    from ...Mans import man1
  File "/temp/man/Mans/man1.py", line 2, in <module>
    from Soft.SoftWork.manModules import *
ModuleNotFoundError: No module named 'Soft'

$ PYTHONPATH=$PYTHONPATH:/temp/man/MansTest/SoftLib
$ export PYTHONPATH
$ echo $PYTHONPATH
:/temp/man/MansTest/SoftLib
$ python3 -m man.MansTest.Unittests.man1test
called foo in man1.py
foo called module1 from manModules: module1 in manModules 

As a suggestion, maybe re-think the purpose of those SoftLib files. Is it some sort of "bridge" between man1.py and 男人测试.py? The way your files are setup right now, I don't think it's going to work as you expect it to be. Also, it's a bit confusing for the code-under-test (man1.py) to be importing stuff from under the test folder (MansTest).

Python-3.x相关问答推荐

如何从Django连接到Neo4J s AuraDB(免费层)?'

如何创建多个日志(log)文件

Pandas 数据帧断言等同于NaN

将列表项的极列水平分解为新列

文件名中的文件打开和撇号

如何使用 Selenium Python 连续单击一个按钮直到另一个元素出现?

无法理解此递归函数的分配和环境用法

如何知道Pandas 列中的每个后续值是否都大于前面的值? Python相关

使用条件参数为 super() 调用 __init__

XPATH:使用 .find_elements_by_xpath 为未知数量的 xpath 输入值

使用一周的特定第一天将每日日期转换为每周

python用户输入5个偶数并打印最大的

smtplib 在 Python 3.1 中发送带有 unicode 字符的邮件的问题

日志(log)模块不适用于 Python3

如何确定一个类的元类?

Python 3.9.8 使用 Black 并导入 `typed_ast.ast3` 失败

django - 值更改后自动更新日期

如何调试垂死的 Jupyter Python3 内核?

Python 3.4 多处理队列比 Pipe 快,出乎意料

如何使用 python http.server 运行 CGI hello world