1

代码比英文精确得多;这是我想做的:

import sys

fileName = sys.argv[1]
className = sys.argv[2]

# open py file here and import the class
# ???

# Instantiante new object of type "className"
a = eval(className + "()") # I don't know if this is the way to do that.

# I "know" that className will have this method:
a.writeByte(0x0)

编辑:

根据答案的要求,这就是我想要做的:

我正在编写一个遵循 SIC/XE 指令集的虚拟处理器。它是一种教育理论处理器,用于向计算机科学专业的学生教授汇编语言和系统软件的基础知识。我试图从“处理器”的编程中抽象出“设备”的概念。本质上,我希望我的程序的用户能够编写他们自己的设备插件(仅限于“read_byte”和“write_byte”功能),然后我希望他们能够在命令下将他们的设备“连接”到处理器-line time,以便他们可以编写如下内容:

python3 sicsim -d1 dev1module Dev1Class -d2 ...

他们还将提供内存图像,这将知道如何与他们的设备进行交互。我基本上希望我们俩都能够编写我们的代码而不会相互干扰。

4

2 回答 2

2

使用importlib.import_module和内置功能getattr。不需要eval

import sys
import importlib

module_name = sys.argv[1]
class_name = sys.argv[2]

module = importlib.import_module(module_name)
cls = getattr(module, class_name)

obj = cls()
obj.writeByte(0x0)

这将要求该文件位于您的 python 路径上的某个位置。大多数情况下,当前目录位于所述路径上。如果这还不够,您将不得不从中解析目录并将append其解析到sys.path. 我很乐意为此提供帮助。只需给我第一个命令行参数的示例输入。

此版本的有效输入类似于:

python3 myscript.py mypackage.mymodule MyClass
于 2012-04-08T00:37:47.707 回答
1

正如 aaronasterling 所提到的,如果有问题的文件恰好位于 python 路径上(在 中列出的目录下sys.path),您可以利用导入机制,但如果不是这种情况,请使用内置exec()函数:

fileVars = {}
exec(file(fileName).read(), fileVars)

然后,要获取该类的实例,您可以跳过eval()

a = fileVars[className]()
于 2012-04-08T00:50:05.950 回答