python - 更改目录后找不到模块

标签 python python-os python-importlib

所以我必须创建一个运行文件夹,即一个包含一堆我需要运行的python文件的文件夹。我可以轻松创建此文件夹,并且所有文件都在那里。但是,当我尝试使用 importlib 运行文件时,python 不会找到它。

我想确保运行的代码实际上是运行文件夹代码,因此我将目录更改为运行文件夹的位置。

abs_path = os.path.abspath("{}".format(run_location))
os.chdir(abs_path)
files = [f for f in os.listdir('.') if os.path.isfile(f)]
print(files)
try:
    driver_module = importlib.import_module("main_driver.py")
    driver_module.main(config, logger)
except Exception as e:
    logger.error("error", str(e))
    finish_fail(config, logger)
finish_success(config, logger)

在上面的示例中,我只想运行main_driver.py。上面的输出是:

['PrepareDataframe.py', 'categorical_encoding.py', 'extra_files.zip', 'build_features.py', 'spot_extractor.py', 'dev.ini', 'featuriser.py', 'main_driver.py', 'time_features_extract.py']

显然,main_driver.py 位于当前工作目录中,但我收到此错误。

No module named 'main_driver'

回溯:

Traceback (most recent call last):
  File "./utils/submit.py", line 292, in <module>
    driver_module = importlib.import_module("main_driver")
  File "/usr/local/Cellar/python/3.7.4_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 965, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'main_driver'

最佳答案

这似乎是一个 PYTHONPATH 问题。

当您运行Python交互式解释器时,sys.path中的第一项是一个空字符串,这实际上意味着“当前目录”。因此,每当您尝试导入模块时,它都会首先在当前目录中查找。

但是,如果您运行 python myscript.py,则情况并非如此 - sys.path 中的第一项是您在运行时所在的实际目录。运行脚本。因此,如果您使用 os.chdir() 更改当前目录,则新的当前目录不在 sys.path 中,因此 import_module(' foo') 由于未找到而失败。

如果您想模仿始终在当前目录中查找模块的交互式 Python 行为,请将 sys.path.insert(0, '') 添加到您的脚本中。

关于python - 更改目录后找不到模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57870498/

相关文章:

python - 如何用不同的数字重命名python中的文件?

Python os.system : Order of commands

python - 来自字符串中定义的函数的 `inspect.getsource`? `s="def f() : return 5 "`

python - 如何在 Python 设置脚本中引入 importlib.resources

python - 获取递归错误: maximum recursion depth exceeded in comparison

python - 在 python 中出现几个回溯错误

python - Buildbot:动态创建新的 Builder 或 BuilderConfig 或项目

python - Try block 捕获错误的异常

Python:如何找到库属于哪个 pip 包?

python - 使用 statsmodels 预测置信区间