我有以下目录结构:
root
/src
file1.py
file2.py
/libs
__init__.py
package.so
Run Code Online (Sandbox Code Playgroud)
我希望导入package.so内file1.py.
我尝试了以下导入语句无济于事:
from .libs.package import func
from libs.package import func
from .libs import package
from libs import package
Run Code Online (Sandbox Code Playgroud)
我想避免设置PYTHONPATH/ sys.path.
有一个简单的方法吗?我认为问题是由于包是共享对象而不仅仅是Python文件 - 我无法访问它的源代码.
谢谢,亚当
如果您不想使用sys.path.append导入文件,我可以使用以下代码片段来完成此操作file1.py:
import imp
import os
file = os.sep+os.path.join(*os.path.realpath(__file__).split(os.sep)[:-1]+['..','libs','package.so'])
package = imp.load_source('root.libs.package', file)
print package.a()
Run Code Online (Sandbox Code Playgroud)
哪个打印<root.libs.package.a instance at 0x101845518>. 请注意,我的 package.so 文件只是一个定义虚拟类的 python 文件a,以便我可以测试导入它。根据我所读到的内容,我相信替换为imp.load_source可能imp.load_dynamic是您想要的。
分解一下:
os.path.realpath(__file__).split(os.sep)[:-1]以字符串列表的形式获取当前运行脚本所在目录的路径。
+['..','libs','package.so']..将包含父目录 ( )、目录和文件名的列表连接libs到该列表,以便 os.path.join 将构建文件的完整路径package.so。
os.path.join(*[that list])将列表元素解压到 的参数中os.path.join,并将字符串与 联接起来os.sep。我还添加了一个前导,os.sep因为它是绝对路径。
imp.load_sourceroot.libs.package返回一个具有从文件路径加载的名称的模块。
该来源对于编写此答案很有用,这里是该模块的文档imp,您可能也会发现它们很有用。
| 归档时间: |
|
| 查看次数: |
206 次 |
| 最近记录: |