我为XBMC编写了一个脚本,它可以选择下载一个dll,然后在下载成功的情况下导入依赖于该dll的模块。 但是,将导入放在函数内会生成Python语法警告。 简化示例:
1 def importIfPresent():
2 if chkFunction() is True:
3 from myOptionModule import *
第3行生成警告,但不会停止脚本。我无法在函数外部开始放置此代码,因为我需要生成对话框以提示下载,然后在下载文件后对文件进行哈希以检查是否成功。我也在启动时调用相同的代码,以检查用户是否已经下载了dll。
在没有生成语法警告的情况下,是否有不同/更好的方法来执行此操作?或者我应该忽略警告并保持原样?
谢谢!使用下面有用的答案,我现在有:
import importlib
myOptionalModule = None
def importIfPresent():
if chkFunction is True:
try:
myOptionalModule = importlib.import_module('modulex')
except ImportError:
myOptionalModule = None
...
importIfPresent()
...
def laterFunction():
if myOptionalModule != None:
myParam = 'something expected'
myClass = getattr(myOptionalModule, 'importClassName')
myFunction = getattr(myClass, 'functionName')
result = myFunction(myClass(), myParam)
else:
callAlternativeMethod()
我发布这篇文章主要是为了与我这样的其他初学者分享我通过讨论学习的方式来使用以这种方式导入的模块的功能而不是标准的import语句。我确信有更优雅的方法可以让专家分享......
答案 0 :(得分:2)
您没有收到在函数内部执行导入的警告,您收到了在函数内使用from <module> import *
的警告。在Python3中,这实际上变为SyntaxError
,而不是SyntaxWarning
。请参阅this answer,了解为何一般情况下要进行通配符导入,特别是不鼓励使用内部函数。
此外,此代码没有按照您的想法执行。在函数内部执行import
时,import
仅在函数内部生效。您没有将该模块导入该文件的全局命名空间,我相信您正在尝试这样做。
正如另一个答案[{1}}中所建议的那样可以帮助您:
尝试: 将myOptionModule导入为opt 除了ImportError: opt =无
importlib
答案 1 :(得分:0)
我相信你需要使用importlib库来促进这一点。
代码将位于mod的顶部:
导入importlib
然后将“from myOptionModule import *”替换为“module = importlib.import_module(myOptionModule)”。然后,您可以使用getattr(模块,NAME(S)TOIMPORT)导入所需的defs /类或导入它们。
看看是否有效。
查看Lutz学习Python的第30章和第31章了解更多信息。