更改目录后找不到模块
Cannot find module after change directory
所以我必须创建一个 运行 文件夹,即一个文件夹,其中包含我需要 运行 的一堆 python 个文件。我可以轻松地创建这个文件夹,所有文件都在那里。但是,当我尝试使用 importlib
运行 文件时,python 找不到它。
我想确保代码 运行ning 实际上是 运行 文件夹代码,因此我将目录更改为 运行 文件夹的位置。
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
中的第一项是空字符串,这实际上意味着 "the current directory"。所以任何时候你尝试导入一个模块,它都会首先在当前目录中查找。
但是,如果您 运行 python myscript.py
,则情况并非如此 -- sys.path
中的第一项是您 运行 时所在的实际目录剧本。因此,如果您使用 os.chdir()
更改当前目录,新的当前目录不在 sys.path
中,因此 import_module('foo')
失败,因为未找到。
如果您想模仿始终在当前目录中查找模块的交互式 python 行为,请将 sys.path.insert(0, '')
添加到您的脚本中。
所以我必须创建一个 运行 文件夹,即一个文件夹,其中包含我需要 运行 的一堆 python 个文件。我可以轻松地创建这个文件夹,所有文件都在那里。但是,当我尝试使用 importlib
运行 文件时,python 找不到它。
我想确保代码 运行ning 实际上是 运行 文件夹代码,因此我将目录更改为 运行 文件夹的位置。
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
中的第一项是空字符串,这实际上意味着 "the current directory"。所以任何时候你尝试导入一个模块,它都会首先在当前目录中查找。
但是,如果您 运行 python myscript.py
,则情况并非如此 -- sys.path
中的第一项是您 运行 时所在的实际目录剧本。因此,如果您使用 os.chdir()
更改当前目录,新的当前目录不在 sys.path
中,因此 import_module('foo')
失败,因为未找到。
如果您想模仿始终在当前目录中查找模块的交互式 python 行为,请将 sys.path.insert(0, '')
添加到您的脚本中。