在一个主要的python文件中,我导入了另一个python文件,它们的名称分别为file1,file2,file3,并且它们内部都有一个名为scrap()
的函数。我试图选择根据用户输入运行哪个文件的scrap()
,如下所示:
python main.py file1
这是我的代码的相关部分:
import file1
import file2
import file3
fileName = sys.argv[1]
for func in ['%s.scrap' % fileName]:
meta, infos = func()
但是,我收到此错误消息:
Traceback (most recent call last):
File "main.py", line 50, in <module>
meta, infos = func()
TypeError: 'str' object is not callable
请注意,当我使用for func in [file1.scrap]:
时,它可以工作,只是不能将用户输入用作导入的文件名。有人可以告诉我该怎么做吗?
答案 0 :(得分:0)
当您实际上是根据命令行参数构建的字符串时,您正在尝试调用func
作为函数。
出于您的目的,就像在prashant的链接文章中提到的那样,您可能希望使用类似imp模块的东西。
这是一个简单的例子
import sys
import imp
# `imp.load_source` requires the full path to the module
# This will load the module provided as `user_selection`
# You can then either `import user_selection`, or use the `mod` to access the package internals directly
mod = imp.load_source("user_selection", "/<mypath>/site-packages/pytz/__init__.py")
# I'm using `user_selection` and `mod` instead of `pytz`
import user_selection
print(user_selection.all_timezones)
print(mod.all_timezones)
在这种情况下,您可能必须使用imp.find_module
才能从名称中获取完整路径,或直接在命令行中提供完整路径。
这应该是一个起点
import sys
import imp
file_name = sys.argv[1]
f, filename, desc = imp.find_module(file_name, ['/path/where/modules/live'])
mod = imp.load_module("selected_module", f, filename, desc)
mod.scrap()