PySide6.QtCore.QLibrary¶
- class QLibrary¶
-
概要¶
属性¶
fileNameᅟ- 库的文件名loadHintsᅟ- 为load()函数提供一些关于其行为方式的提示
方法¶
def
__init__()def
errorString()def
fileName()def
isLoaded()def
load()def
loadHints()def
resolve()def
setFileName()def
setLoadHints()def
unload()
静态函数¶
def
isLibrary()def
resolve()
注意
本文档可能包含从C++自动翻译到Python的代码片段。我们始终欢迎对代码片段翻译的贡献。如果您发现翻译问题,您也可以通过在我们的https:/bugreports.qt.io/projects/PYSIDE上创建工单来告知我们。
详细描述¶
警告
本节包含从C++自动翻译到Python的代码片段,可能包含错误。
一个
QLibrary对象的实例操作于单个共享对象文件(我们称之为“库”,但也称为“DLL”)。QLibrary以平台独立的方式提供对库中功能的访问。您可以在构造函数中传递文件名,或者使用setFileName()显式设置它。在加载库时,QLibrary会在所有系统特定的库位置(例如Unix上的LD_LIBRARY_PATH)中搜索,除非文件名具有绝对路径。如果文件名是绝对路径,则首先尝试加载此路径。如果找不到文件,
QLibrary会尝试使用不同平台特定的文件前缀(如 Unix 和 Mac 上的“lib”)和后缀(如 Unix 上的“.so”、Mac 上的“.dylib”或 Windows 上的“.dll”)来查找文件。如果文件路径不是绝对的,那么
QLibrary会修改搜索顺序,首先尝试系统特定的前缀和后缀,然后是指定的文件路径。这使得可以指定仅通过其基本名称(即不带后缀)识别的共享库,因此相同的代码可以在不同的操作系统上工作,同时仍然最大限度地减少查找库的尝试次数。
最重要的函数是
load()用于动态加载库文件,isLoaded()用于检查加载是否成功,以及resolve()用于解析库中的符号。resolve()函数在库尚未加载时会隐式尝试加载库。可以使用多个QLibrary实例来访问同一个物理库。一旦加载,库将保留在内存中,直到应用程序终止。您可以尝试使用unload()卸载库,但如果其他QLibrary实例正在使用同一个库,调用将失败,卸载只有在每个实例都调用unload()时才会发生。QLibrary的典型用法是解析库中的导出符号,并调用该符号表示的 C 函数。这被称为“显式链接”,与“隐式链接”相对,后者是在构建过程中将可执行文件与库链接时由链接步骤完成的。以下代码片段加载一个库,解析符号“mysymbol”,并在一切成功时调用函数。如果出现问题,例如库文件不存在或符号未定义,函数指针将为
None并且不会被调用。myLib = QLibrary("mylib") void = typedef(MyPrototype)() myFunction = (MyPrototype) myLib.resolve("mysymbol") if myFunction: myFunction()
符号必须作为C函数从库中导出,以便
resolve()能够工作。这意味着如果库是用C++编译器编译的,函数必须包装在extern "C"块中。在Windows上,这还需要使用dllexport宏;有关如何完成此操作的详细信息,请参见resolve()。为了方便起见,有一个静态的resolve()函数,如果您只想调用库中的函数而不需要显式加载库,可以使用它:void = typedef(MyPrototype)() myFunction = (MyPrototype) QLibrary.resolve("mylib", "mysymbol") if myFunction: myFunction()
另请参阅
- class LoadHint¶
(继承自
enum.Flag) 此枚举描述了在加载库时可以使用的可能提示,以改变库的处理方式。这些值指示在加载库时如何解析符号,并通过setLoadHints()函数指定。常量
描述
QLibrary.ResolveAllSymbolsHint
在加载库时解析库中的所有符号,而不仅仅是在调用
resolve()时解析。QLibrary.ExportExternalSymbolsHint
导出库中未解析和外部符号,以便它们可以在稍后加载的其他动态加载库中解析。
QLibrary.LoadArchiveMemberHint
允许库的文件名指定归档文件中的特定对象文件。如果给出此提示,库的文件名由路径组成,该路径是对归档文件的引用,后跟对归档成员的引用。
QLibrary.PreventUnloadHint
如果调用了close(),则阻止库从地址空间卸载。如果稍后调用了open(),库的静态变量不会重新初始化。
QLibrary.DeepBindHint
指示链接器在解析加载库中的外部符号时,优先使用加载库中的定义,而不是加载应用程序中的导出定义。此选项仅在Linux上受支持。
另请参阅
- class LoadStatusTag¶
注意
当使用
from __feature__ import true_property时,属性可以直接使用,否则通过访问器函数使用。- property fileNameᅟ: str¶
此属性保存库的文件名。
我们建议在文件名中省略文件的后缀,因为
QLibrary会自动查找带有适当后缀的文件(参见isLibrary())。加载库时,
QLibrary会在所有系统特定的库位置(例如,Unix 上的LD_LIBRARY_PATH)中搜索,除非文件名具有绝对路径。成功加载库后,fileName() 返回库的完全限定文件名,包括在构造函数中给出或传递给 setFileName() 的库的完整路径。例如,在Unix平台上成功加载“GL”库后,fileName()将返回“libGL.so”。如果文件名最初传递为“/usr/lib/libGL”,fileName()将返回“/usr/lib/libGL.so”。
- Access functions:
- property loadHintsᅟ: Combination of QLibrary.LoadHint¶
此属性为
load()函数提供一些关于其应如何行为的提示。你可以提供一些关于符号如何解析的提示。通常,符号不会在加载时解析,而是延迟解析(即当调用
resolve()时)。如果你将loadHints设置为ResolveAllSymbolsHint,那么如果平台支持,所有符号将在加载时解析。设置
ExportExternalSymbolsHint将使库中的外部符号在后续加载的库中可用于解析。如果设置了
LoadArchiveMemberHint,文件名由两个部分组成:一个路径,它是对存档文件的引用,后跟第二个部分,它是对存档成员的引用。例如,fileNamelibGL.a(shr_64.o)将引用名为libGL.a的存档文件中的库shr_64.o。这仅在 AIX 平台上受支持。负载提示的解释依赖于平台,如果你使用它,你可能正在对编译的平台做出一些假设,因此只有在理解其后果的情况下才使用它们。
默认情况下,这些标志都没有设置,因此库将以延迟符号解析的方式加载,并且不会导出外部符号以供其他动态加载的库解析。
注意
只有当此对象未与文件关联时,才能清除提示。只有在设置文件名后才能添加提示(
hints将与旧提示进行或运算)。注意
在库加载后设置此属性无效,loadHints() 将不会反映这些更改。
注意
此属性在所有引用同一库的
QLibrary实例之间共享。- Access functions:
使用给定的
parent构建一个库。- __init__(fileName[, parent=None])
- Parameters:
fileName – str
parent –
QObject
使用给定的
parent构造一个库对象,该对象将加载由fileName指定的库。我们建议在
fileName中省略文件的后缀,因为QLibrary会根据平台自动查找带有适当后缀的文件,例如在Unix上是“.so”,在macOS和iOS上是“.dylib”,在Windows上是“.dll”。(参见fileName。)- __init__(fileName, version[, parent=None])
- Parameters:
fileName – str
version – str
parent –
QObject
使用给定的
parent构造一个库对象,该对象将加载由fileName指定的库和完整版本号version。目前,在Windows上忽略版本号。我们建议在
fileName中省略文件的后缀,因为QLibrary会根据平台自动查找带有适当后缀的文件,例如在Unix上是“.so”,在macOS和iOS上是“.dylib”,在Windows上是“.dll”。(参见fileName。)- __init__(fileName, verNum[, parent=None])
- Parameters:
fileName – str
verNum – int
parent –
QObject
使用给定的
parent构造一个库对象,该对象将加载由fileName指定的库和主版本号verNum。目前,在Windows上忽略版本号。我们建议在
fileName中省略文件的后缀,因为QLibrary会根据平台自动查找带有适当后缀的文件,例如在Unix上是“.so”,在macOS和iOS上是“.dylib”,在Windows上是“.dll”。(参见fileName。)- errorString()¶
- Return type:
字符串
返回一个包含最后发生错误的描述文本字符串。目前,errorString 仅在
load()、unload()或resolve()由于某种原因失败时才会被设置。- fileName()¶
- Return type:
字符串
另请参阅
属性
fileNameᅟ的获取器。- static isLibrary(fileName)¶
- Parameters:
fileName – str
- Return type:
布尔
如果
fileName具有可加载库的有效后缀,则返回true;否则返回false。平台
有效后缀
Windows
.dll,.DLLUnix/Linux
.soAIX
.aHP-UX
.sl,.so(HP-UXi)macOS 和 iOS
.dylib,.bundle,.soUnix上的尾随版本号被忽略。
- isLoaded()¶
- Return type:
布尔
如果
load()成功,则返回true;否则返回false。- load()¶
- Return type:
布尔
加载库并在库成功加载时返回
true;否则返回false。由于resolve()在解析任何符号之前总是调用此函数,因此不需要显式调用它。在某些情况下,您可能希望提前加载库,这时您将使用此函数。另请参阅
属性
loadHintsᅟ的获取器。- resolve(symbol)¶
- Parameters:
symbol – str
- Return type:
QFunctionPointer
警告
本节包含从C++自动翻译到Python的代码片段,可能包含错误。
返回导出符号
symbol的地址。如果需要,库会被加载。如果无法解析符号或无法加载库,函数将返回None。示例:
typedef int (AvgFunction)(int, int) avg = (AvgFunction) library.resolve("avg") if avg: return avg(5, 8) else: return -1
符号必须作为C函数从库中导出。这意味着如果库是用C++编译器编译的,函数必须用
extern "C"包裹。在Windows上,还必须使用__declspec(dllexport)编译器指令显式地从DLL中导出函数,例如:extern "C" MY_EXPORT int avg(int a, int b) return (a + b) / 2
使用
MY_EXPORT定义为#ifdef Q_OS_WIN #define MY_EXPORT __declspec(dllexport) #else #define MY_EXPORT #endif
- static resolve(fileName, symbol)
- Parameters:
fileName – str
symbol – str
- Return type:
QFunctionPointer
这是一个重载函数。
加载库
fileName并返回导出符号symbol的地址。请注意,fileName不应包含平台特定的文件后缀;(参见fileName)。库将保持加载状态,直到应用程序退出。如果无法解析符号或无法加载库,函数将返回
None。另请参阅
- static resolve(fileName, version, symbol)
- Parameters:
fileName – str
version – str
symbol – str
- Return type:
QFunctionPointer
这是一个重载函数。
加载带有完整版本号
version的库fileName并返回导出符号symbol的地址。请注意,fileName不应包含平台特定的文件后缀;(参见fileName)。该库将保持加载状态,直到应用程序退出。version在 Windows 上被忽略。如果无法解析符号或无法加载库,该函数将返回
None。另请参阅
- static resolve(fileName, verNum, symbol)
- Parameters:
fileName – str
verNum – int
symbol – str
- Return type:
QFunctionPointer
这是一个重载函数。
加载库
fileName,主版本号为verNum,并返回导出符号symbol的地址。请注意,fileName不应包含平台特定的文件后缀;(参见fileName)。库将保持加载状态,直到应用程序退出。verNum在 Windows 上被忽略。如果无法解析符号或无法加载库,函数将返回
None。另请参阅
- setFileName(fileName)¶
- Parameters:
fileName – str
另请参阅
属性
fileNameᅟ的设置器。- setFileNameAndVersion(fileName, version)¶
- Parameters:
fileName – str
version – str
将
fileName属性和完整版本号分别设置为fileName和version。在Windows上,version参数被忽略。另请参阅
- setFileNameAndVersion(fileName, verNum)
- Parameters:
fileName – str
verNum – int
将
fileName属性和主版本号分别设置为fileName和versionNumber。在Windows上,versionNumber被忽略。另请参阅
属性
loadHintsᅟ的设置器。- unload()¶
- Return type:
布尔
卸载库并返回
true如果库可以被卸载;否则返回false。这会在应用程序终止时自动发生,因此通常不需要调用此函数。
如果其他
QLibrary实例正在使用相同的库,调用将失败,卸载只有在每个实例都调用了unload()时才会发生。请注意,在macOS上,动态库无法被卸载。QLibrary::unload()将返回
true,但库仍将保留在进程中。