如何运行子目录中的脚本?导入错误:找不到模块x。

4

我的目录结构:

r/
 |___init__.py
 |
 |_d1/
 |   |___init__.py
 |   |_s1.py
 |
 |_d2/
     |___init__.py
     |_s2.py

s1.py的内容:

a = 1

print(a)

s2.py的内容:

from d1.s1 import a

print(2 * a)

我进入目录 /r 并执行 python3 d1/s1.py。终端会输出 1

当我执行 python3 d2/s2.py 时,会出现错误 ImportError: No module named 'd1'。如何执行脚本 s2

1个回答

1

当你说:

from d1.s1 import a

Python会首先查找名为d1的模块,然后在其中查找名为s1的模块,并在其中查找名为a的对象(该对象可以是常规python对象或另一个模块)。因此,
from d1.s1 import a

可以有几种不同的方式来工作:
-- d1/
    -- __init__.py
      -- s1.py          <-- contains a variable called "a"

或者

- d1/
    -- __init__.py
    -- s1/
        -- __init__.py
        -- a.py

或者

-- d1/
|    -- __init__.py
    -- s1/
        -- __init__.py     <-- contains a variable called "a"

在您的情况下,只有当d1、s1和s2在同一个目录中时,init.py才能起作用。
如果您想从另一个子目录d1导入模块s1,请确保将目录d1添加到sys路径中。
要将d1添加到sys路径中,请:
sys.path.append('path_to_directory/d1') 

我不太理解。我该如何让它按照现有方式工作?即在/r中执行某些命令,然后脚本s2.py就可以工作?通常我具有类似的文件夹结构,其中d2为测试文件夹。当我运行“python3 -m unittest discover”时,它会自动了解如何进行导入。 - wtaga
@wtaga,那么,目录r/d1不在sys.path中。 - Saranraj Nambusubramaniyan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接