我有一个包:pyfoo在目录/ home / user / somedir
中包装是正常的 '/home/user/somedir/pyfoo/__init__.py'
我希望能够使用其完整路径'/ home / user / somedir / pyfoo /'
导入此模块如何为非包模块执行此操作,如下所示: How to import a module given the full path?
但是当模块是一个包时,我似乎无法让它工作。
我发现这个非常奇怪的用例是在使用h5py写入文件之前,我深深嵌入了脚本执行。
我必须卸载h5py并使用openmpi重新安装并行版本,但即使它已卸载,h5py(串行)仍在内存中。我不想重启,因为脚本花了很长时间。我试图重新加载模块,但它没有用。我也尝试使用目录和__init__.py从文件名中导入它,但我得到了相对导入错误。我甚至尝试将新的安装位置添加到sys.path并执行正常导入,但这也失败了。
我的个人实用程序库中已经有一个import_from_filepath函数,我也想添加import_from_dirpath,但是我在弄清楚它是如何完成时遇到了一些麻烦。
这是一个说明问题的脚本:
# Define two temporary modules that are not in sys.path
# and have the same name but different values.
import sys, os, os.path
def ensuredir(path):
if not os.path.exists(path):
os.mkdir(path)
ensuredir('tmp')
ensuredir('tmp/tmp1')
ensuredir('tmp/tmp2')
ensuredir('tmp/tmp1/testmod')
ensuredir('tmp/tmp2/testmod')
with open('tmp/tmp1/testmod/__init__.py', 'w') as file_:
file_.write('foo = \"spam\"\nfrom . import sibling')
with open('tmp/tmp1/testmod/sibling.py', 'w') as file_:
file_.write('bar = \"ham\"')
with open('tmp/tmp2/testmod/__init__.py', 'w') as file_:
file_.write('foo = \"eggs\"\nfrom . import sibling')
with open('tmp/tmp1/testmod/sibling.py', 'w') as file_:
file_.write('bar = \"jam\"')
# Neither module should be importable through the normal mechanism
try:
import testmod
assert False, 'should fail'
except ImportError as ex:
pass
# Try temporarilly adding the directory of a module to the path
sys.path.insert(0, 'tmp/tmp1')
testmod1 = __import__('testmod', globals(), locals(), 0)
sys.path.remove('tmp/tmp1')
print(testmod1.foo)
print(testmod1.sibling.bar)
sys.path.insert(0, 'tmp/tmp2')
testmod2 = __import__('testmod', globals(), locals(), 0)
sys.path.remove('tmp/tmp2')
print(testmod2.foo)
print(testmod2.sibling.bar)
assert testmod1.foo == "spam"
assert testmod1.sibling.bar == "ham"
# Fails, returns spam
assert testmod2.foo == "eggs"
assert testmod2.sibling.bar == "jam"
sys.path方法不通过文件路径导入。它默认导入以前加载的模块。
答案 0 :(得分:1)
通常,您不会从Python中的绝对路径进行导入。它可能会破坏该模块中的导入。
您所做的是调整PYTHONPATH
。它告诉python在哪里查找要导入的内容。您可以在调用脚本之前设置环境变量PYTHONPATH
,也可以在运行时查看和操作它。为此,请更改sys.path
。它是一个列表,您可以append()
其他路径。
另一种选择是使用虚拟环境,为不同的项目和项目设置提供特殊的python环境。阅读http://docs.python-guide.org/en/latest/dev/virtualenvs/以了解它。
如果您仍想按路径导入,请阅读How to import a module given the full path?。