我有一个python脚本试图在文件系统中的某处导入另一个脚本(路径仅在运行时已知)。 根据我的理解,我需要使用imp模块,这可能会起作用,但是在加载模块时,我得到的错误是找不到导入模块使用的模块。
下面是代码:
importer.py:
import imp
imp.load_compiled("my_module","full_path_to_my_module\\my_module.pyc")
my_module.py:
import sys
import another_module
当我运行importer.py时,我收到htis错误消息:
ImportError:没有名为another_module的模块
这里出了什么问题? 我怀疑当'importer.py'正在加载'my_module.pyc'时他也试图加载'another_module'(这很好)但是看错了地方(例如不是'full_path_to_my_module')
修改 我尝试将'full_path_to_my_module'添加到系统路径:
import imp
import sys
sys.path.append(full_path_to_my_module)
imp.load_compiled("my_module",full_path_to_my_module+my_module)
但我仍然得到同样的错误
也许我做了一些不必要的事情 - 这是我的目标: 我希望能够在'importer.py'中使用'my_module.pyc'的所有功能。但'my_module.pyc'的位置作为'importer.py'的参数给出。
答案 0 :(得分:8)
imp.load_compiled
返回已编译的模块对象,它与import
语句不同,后者还将模块绑定到名称
import imp
my_module = imp.load_compiled("my_module", "full_path_to_my_module/my_module.pyc")
然后你可以做类似的事情:
my_module.yayfunctions('a')
完成示例会话:
$ cat /tmp/my_module.py
def yayfunctions(a):
print a
$ python -m compileall /tmp/my_module.py
$ ls /tmp/my_module.py*
my_module.py my_module.pyc
$ python
>>> import imp
>>> my_module = imp.load_compiled("my_module", "/tmp/my_module.pyc")
>>> my_module.yayfunctions('a')
a
关于评论(ImportError: No module named another_module
)的修改,我认为错误是由my_module.pyc
中的代码引起的,another_module.py
位于同一目录中
在这种情况下,正如其他人所建议的那样,只需将包含my_module
的目录添加到sys.path
并使用常规导入机制,特别是__import__
这是一个应该做你想做的功能:
import os
def load_path(filepath):
"""Given a path like /path/to/my_module.pyc (or .py) imports the
module and returns it
"""
path, fname = os.path.split(filepath)
modulename, _ = os.path.splitext(fname)
if path not in sys.path:
sys.path.insert(0, path)
return __import__(modulename)
if __name__ == '__main__':
# Example usage
my_module = load_path('/tmp/my_module.py')
my_module.yayfunctions('test')
答案 1 :(得分:3)
因为在import another_module
的范围内你的“full_path_to_my_module”未知。
您是否尝试将路径添加到已知路径,即:
import sys
sys.path.append("full_path_to_my_module")
答案 2 :(得分:1)
您实际上不需要使用imp模块来加载pyc模块。
一个简单的方法是尝试制作两个python模块,一个从另一个导入并运行它。然后删除导入的.py文件,这样你只能得到.pyc文件:运行脚本时,导入工作正常。
但是,为了从随机目录导入py文件,您可能希望在导入之前先将该目录添加到python路径。
例如:
import sys
sys.path.insert(0, "/home/user/myrandomdirectory")
答案 3 :(得分:0)
加载pyc文件的方式与加载py文件的方式完全相同,只是它不执行编译步骤。因此,只要pyc的版本号与您正在运行的python相同,只使用import mymodule
即可。否则你会得到一个幻数错误。
如果您的模块不在您的路径中,您需要将其添加到sys - 或者如果它是一个子目录,请将__init__.py
文件添加到该目录中。