How to run a script located in a subdirectory? ImportError: No module named x

wta*_*aga 5 python directory scripting

My directory structure:

r/
 |___init__.py
 |
 |_d1/
 |   |___init__.py
 |   |_s1.py
 |
 |_d2/
     |___init__.py
     |_s2.py
Run Code Online (Sandbox Code Playgroud)

contents of s1.py:

a = 1

print(a)
Run Code Online (Sandbox Code Playgroud)

contents of s2.py:

from d1.s1 import a

print(2 * a)
Run Code Online (Sandbox Code Playgroud)

我导航到目录/r并执行python3 d1/s1.py. 终端打印1。当我执行时python3 d2/s2.py出现错误ImportError: No module named 'd1'。如何执行脚本s2

sar*_*nns 1

当你说,

from d1.s1 import a
Run Code Online (Sandbox Code Playgroud)

Python 将首先查找名为 d1 的模块,然后在其中查找名为 s1 的模块,然后在其中查找名为 a 的对象(可能是常规 python 对象,或另一个模块)。

所以,

from d1.s1 import a
Run Code Online (Sandbox Code Playgroud)

可以通过几种不同的方式工作:

-- d1/
    -- __init__.py
      -- s1.py          <-- contains a variable called "a"
Run Code Online (Sandbox Code Playgroud)

或者

- d1/
    -- __init__.py
    -- s1/
        -- __init__.py
        -- a.py
Run Code Online (Sandbox Code Playgroud)

或者

-- d1/
|    -- __init__.py
    -- s1/
        -- __init__.py     <-- contains a variable called "a"
Run Code Online (Sandbox Code Playgroud)

在您的情况下,init .py 仅当 d1 和 s1 和 s2 位于同一目录中时才有效。

如果要从另一个子目录 d1 导入模块 s1,请确保 d1 目录位于 sys 路径中。

将 d1 添加到 sys 路径

sys.path.append('path_to_directory/d1') 
Run Code Online (Sandbox Code Playgroud)