我正在开发一个Python包,它可以通过接收用户定义的对象来工作,这些对象都是我编写的类的实例。我设计的方式是,用户按照一个或多个python脚本中的定义传递其对象(请参见下面的示例)。
我想访问用户在脚本中定义的对象。我该怎么办?
我按文件名查看导入,但无济于事。我什至继续使用imp.load_source
,但没有解决。
一些典型的用户定义对象
为解决这个问题,假设所有方法都在Base中定义。我理解我所要求的导致任意代码执行的原因,因此我愿意接受这样的建议:用户可以任意但安全地传递其Base
类的实例。
foo.py具有以下代码:
from package import Base
foo = Base('foo')
foo.AddBar('bar', 'bar')
foo.AddCow('moo')
ooo.py:
from package import Base
ooo = Base('ooo')
ooo.AddBar('ooo','ooo')
ooo.AddO(12)
然后我的主程序运行为
main_program -p foo.py ooo.py
我希望能够访问foo
正文中的ooo
,main_program
。
我正在使用python2.7 我知道我正在使用较旧的Python,我会尽快采取行动
importlib
尝试了importlib.import_module
,但它抛出了ImportError: Import by filename is not supported
。
__import__
我尝试使用__import__('/path/to/file.py')
,但是它抛出了相同的ImportError: Import by filename is not supported.
目前,任何允许我使用用户输入脚本中定义的对象的解决方案都可以使用。
答案 0 :(得分:0)
如果可以跳过文件名中的.py
,可以通过要求用户传递module name
(基本上是没有py
的文件名)扩展名来解决< / p>
tester.py
class A:
def write(self):
print("hello")
obj = A()
现在,我们要从名为obj
的文件中动态访问test.py
,所以我们这样做
python test.py tester
test.py有什么作用?它根据名称导入模块并访问它的方法。请注意,这是假设您不关心用户传递对象的顺序
test.py
import sys
# Get all parameters (sys.argv[0] is the file name so skipping that)
module_names = sys.argv[1:]
# I believe you can also do this using importlib
modules = list(map(__import__, module_names))
# modules[0] is now "tester"
modules[0].obj.write()
将其映射到您的示例中,我认为应该是
foo.py
from package import Base
foo = Base('foo')
foo.AddBar('bar', 'bar')
foo.AddCow('moo')
ooo.py
from package import Base
ooo = Base('ooo')
ooo.AddBar('ooo','ooo')
ooo.AddO(12)
并以以下方式运行主程序
python main_program.py foo ooo
答案 1 :(得分:0)
您尝试过
从(无论文件名是)import *
也不要在文件名中包含.py。