为了导入位于磁盘上某处的项目特定模块,可以轻松地将此目录附加到 sys.path:
import sys
sys.path.append(some_module_path)
import some_module
但是,后者导入现在违反了 PEP E402(“模块级导入不在文件顶部”)。至少spyder是这么告诉我的。这里的spyder是不是太挑剔了?
在spyder中有一个“项目”的主要思想,我假设可以针对该项目专门调整环境。但是,我不知道如何修改,例如sys.path 取决于spyder 项目。
如何修改spyder项目中的sys.path?或者有一个通用的Python方法来解决这个问题吗?
您可以将
sys.path
扩展放在单独的模块中,例如_paths.py
。
_paths.py
的内容:
import sys
sys.path.append(some_module_path)
sys.path.append(some_other_module_path)
# ...and so on...
然后在您的主应用程序中:
import sys
import _paths
import some_module
some_module.some_func()
该解决方案将您的“项目配置”很好地放在一个地方(这使得将来易于维护),并且至少符合 PEP8(包括 E402)和 pylint 规则。
如果发现这对我来说是可行的解决方案,则可以使用单独的模块作为answer的替代解决方案。
try:
sys.path.append(Path(__file__).parent.parent)
except IndexError:
pass
如果我只使用
sys.path.append(...)
,我会收到警告,但使用 try-catch 块不会产生警告。
我知道这并不能回答问题,但它可能是有用的信息。
您可以通过直接指定模块的路径来导入该模块,而无需使用
sys.path.append
在 Python 3 中,这就像
一样简单import imp
some_module = imp.load_source('some_module', '/path/to/some_module.py')
更多信息请参见:如何导入给定完整路径的模块?
@wovano 的解决方案对我帮助很大。
但是由于我对导入警告感到恼火,所以我稍微调整了解决方案。
文件_paths.py:
import sys
import git
sys.path.append(git.Repo('.', search_parent_directories=True).working_tree_dir)
fix_import_warning = 'fix_import_warning'
在执行导入的文件中: 进口期间:
import _paths
最后:
def fix_import_warning(fix_import_warning = _paths.fix_import_warning):
print(fix_import_warning)