在Python 3.2中,如何从指定文件动态打开和编译类?

在Python 3.2中,如何从指定文件动态打开和编译类?,python,Python,代码比英语精确得多;以下是我想做的: 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

代码比英语精确得多;以下是我想做的:

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指令集的虚拟处理器。它是一种教育理论处理器,用于向计算机科学学生教授汇编语言和系统软件的基础知识。我试图从“处理器”的编程中抽象出“设备”的概念。本质上,我希望我的程序的用户能够编写自己的设备插件(限于“读字节”和“写字节”功能),然后我希望他们能够在命令行时间将设备“连接”到处理器,这样他们就可以写下这样的东西:

python3 myscript.py mypackage.mymodule MyClass
python3sicsim-d1 dev1模块dev1类-d2…

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

使用和内置函数。无需
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路径上的某个位置。大多数情况下,当前目录位于所述路径上。如果这还不够,您必须从中解析目录,并将其附加到
sys.path
中。我很乐意帮忙。只需为第一个命令行参数提供一个示例输入

此版本的有效输入如下所示:

python3 myscript.py mypackage.mymodule MyClass

正如aaronasterling提到的,如果所讨论的文件恰好位于python路径上(在
sys.path
中列出的目录下的某个地方),您可以利用导入机制,但如果不是这样,请使用内置函数:

fileVars = {}
exec(file(fileName).read(), fileVars)
然后,要获取类的实例,可以跳过
eval()


如果我这样做了,会执行类定义之外的代码吗?@WordsLekeJared类定义之外的代码将使用这两种方法执行。@类似Jared的词:如果您需要该功能,您可能试图解决错误的问题。也许你应该告诉我们更多关于你正在尝试做的事情。是不是这样的情况下,
importlib
模块单词有点像从模块中导入单个项目(我不确定“项目”是否是正确的技术术语,但请耐心听我说),但是使用
exec()
方法类似于
import*
?我认为前一种方法更安全,这样你就不会覆盖你自己的变量等等。这两种方法都不像
import*
,也都不会覆盖变量。两者都将执行整个文件。这不好有什么原因吗?如果文件是以标准方式编写的,则只有在将其作为实际更改状态超过该状态的代码导入时,才会运行定义。如果uuu name uuuu==''main uuu':,则只有
import
语句会更改您自己的模块或函数名称空间,
importlib
中的函数总是返回模块或python对象,这就是为什么这里有一个分配给
module
的原因。根据您的评论,您似乎在避免
import
使用任何
文件名
是因为您不希望运行某些顶级代码;太糟糕了,你不能那样做!但是还有其他选择,如果您向我们展示更多的代码,我相信我们可以向您展示如何重构“待导入”文件名。我编辑了我的问题,以更全面地解释我的情况。根据您所说的,您实现插件的一般方法似乎是合理的。其他具有类似设计的python程序仍然要求正常加载整个文件。