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」機能に限定) を作成できるようにしてから、コマンドでデバイスをプロセッサに「接続」できるようにしたいと考えています。 -行時間、次のようなものを書くことができます:

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 に答える