【问题标题】:Import scripts and execute the one the user needs导入脚本并执行用户需要的脚本
【发布时间】:2014-08-06 13:36:21
【问题描述】:

我有三个脚本,它们都写成一个或几个函数 我有这个导入它们的另一个脚本,但是当我运行它时,它会运行其他三个脚本(一个接一个)

import script1
import script2
import script3
#import sys 
#he i have some other lines but they just dont work

in=raw_input("write python+name_of_this_file+name_of_the_function")
#i do not know how to continue

我能做些什么来运行这个脚本并只执行用户想要的文件,我对 python 了解不多(三个脚本花了我很多时间来制作它们) 提前谢谢你

【问题讨论】:

标签: python function command-line import


【解决方案1】:

如果是函数,如何动态导入python模块并调用它?

使用importlib.import_module()。例如,

import importlib

response = raw_input("Please type module_name function_name: ")
module_name, function_name = response.split()
print "User entered module_name %r, function_name %r" % (module_name, function_name)

try:
    module = importlib.import_module(module_name)
    result = getattr(module, function_name)()
    print "%s.%s() returned %r" % (module_name, function_name, result)
except ImportError, e:
    print "Failed to import module %r" % module
except AttributeError, e:
    print "Function %r not found in module %s" % (function_name, module_name)

【讨论】:

  • 谢谢,我想这对于了解 python 的人来说是令人厌烦的,非常感谢您的回答
【解决方案2】:

不看script1.py、script2.py和script3.py的内容很难说。我猜每个模块中都有正在执行的顶级代码,而您不希望这种情况发生。

模块中的代码将在导入时执行。例如,如果 script1.py 包含以下内容:

# script1.py
def f():
    print "not called on import"

# following will be executed on first import
print "print was executed"
x = 10
print x * x

导入它将导致:

>>> import script1
print was executed
100

函数中的代码没有被执行,但是声明函数的语句被执行了。

您可以通过检查__name__ 变量来阻止在导入时执行顶级代码,如下所示:

# script1.py
def f():
    print "not called on import"

if __name__ == '__main__':
    # following will NOT be executed on first import, only if run directly
    print "print was executed"
    x = 10
    print x * x

>>> import script1
>>> script1.f()
not called on import

但是,如果直接执行script1.py会出现打印的内容:

$ python script1.py
print was executed
100

您问题的另一部分是用户如何调用在您的三个脚本文件中声明的函数?例如,您可以使用input() 而不是raw_input(),并让用户输入字符串script1.f()

# main.py
import script1
import script2
import script3

if __name__ == '__main__':
    input("write <module_name>.<name_of_the_function>() : ")

$ python main.py 
write <module_name>.<name_of_the_function>() : script1.f()
not called on import

【讨论】:

  • 你好,我没有顶级代码,这三个脚本包含我只需要编写 python+code_that_imports+script1(或 2 或 3)的函数,并且运行用户选择的脚本
  • 我尝试了最后一个块,但它仍然一个接一个地运行三个脚本
  • 我真的不清楚您要做什么。运行 python 脚本文件和导入 python 模块是有区别的。您是尝试通过启动新的 python 进程(即子进程)来执行脚本(例如 script1.py),还是想要动态导入用户指定的模块(例如 script1),然后执行其中存储的函数之一模块?
  • 我想像问题之一那样执行脚本,并且用户必须选择必须执行哪个脚本(1,2 或 3),我想这是 - 动态导入指定的用户模块并执行该模块中的所有功能 - 抱歉不清楚,无论如何,感谢您的时间
  • 我已经为“动态导入一个模块并调用它的一个函数”添加了一个答案。如果你想执行它的所有函数,你最好为每个模块创建一个函数来调用模块中的每个函数。也可以使用自省(参见检查模块),但这更难。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-25
  • 1970-01-01
相关资源
最近更新 更多