从另一个位置导入文件 - python

import a file from another location - python

有两个文件夹,每个文件夹包含一个 python 文件。 例如:first_folder 包含 a.py & second_folder 包含 b.py

我尝试在 a.py 中导入 b.py 但是我没有导入错误。

ImportError: 没有名为 b

的模块

请帮我解决这个问题。我也尝试在两个文件夹中创建一个空白 init.py,但它没有用。

文件夹结构:

/home/user/scripts/

 |
 |--------python_scripts
 |          |
 |          |
 |          |------- a.py
 |
 |--------lib
           |
           |-------b.py

如果文件在同一目录中,请键入此

Import .other_file

Python 的 import 将在 python 路径中查找模块(.py 文件)。您可以在 sys.path 变量中查看 python 路径中的内容。

默认情况下,sys.path 将包含您 运行 脚本所在的目录。它还将包括 PYTHONPATH 环境变量中定义的所有内容。

因此,如果您有两个包含 .py 个文件的目录,您可以将它们都放在 python 路径中,或者您可以确保所有源代码都在同一路径条目下。

选项 1

(此语法取决于您的 shell,此处适用于 windows)

set PYTHONPATH=%PYTHONPATH%;\path\to\second_folder

python \path\to\first_folder\a.py

然后,您可以简单地import b

选项 2

在两个目录中创建一个空 __init__.py 并在它们上方的目录中创建一个 run.py,因此您有:

root_dir
    run.py
    first_folder
        __init__.py
        a.py
    sedond_folder
        __init__.py
        b.py

run.py 作为您的入口点 (运行 python run.py),然后您可以使用完整的模块名称从任何其他模块导入任何模块:

import first_folder.a
import second_folder.b

假设你有这样的文件

.
├── first_folder
│   └── a.py
└── second_folder
    └── b.py

您可以使用 abs 路径将 a.py 作为模块导入 b.py

import importlib.util

spec = importlib.util.spec_from_file_location('a', 'path/to/first_folder/a.py')

foo = importlib.util.module_from_spec(spec)

spec.loader.exec_module(foo)

print(dir(foo))

还有一个方便的加载方式b.py

$ cd path/to/second_folder

$ ln -s path/to/first_folder ./first_folder

并导入 a.py 作为普通 python 模块

import a from first_folder