通过作为参数传递的文件名导入

时间:2019-04-04 02:37:32

标签: python

我正在开发一个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正文中的ooomain_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.

目前,任何允许我使用用户输入脚本中定义的对象的解决方案都可以使用。

2 个答案:

答案 0 :(得分:0)

如果可以跳过文件名中的.py,可以通过要求用户传递module name(基本上是没有py的文件名)扩展名来解决< / p>

参考this的答案和this的书,这是一个示例

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。