2017-01-19 206 views
1

我有一个python脚本,它有一个方法,它接受一个包含另一个python脚本的字符串。我想执行该脚本,调用其中的函数,然后在主脚本中使用该函数的结果。目前,它看起来是这样的:假设从python执行复杂的python脚本

def executePythonScript(self, script, param): 
     print 'Executing script' 
     try: 
      code = compile(script, '<string>', 'exec') 
      exec code 
      response = process(param) 
     except Exception as ex: 
      print ex 
     print 'Response: ' + response 
     return response 

“过程”功能在被编译并执行运行时的脚本存在。

该解决方案非常适用于非常简单的脚本,如:

def process(): 
    return "Hello" 

...但我有没有运气越来越复杂的脚本来执行。举例来说,如果我的脚本使用JSON包,我得到:

global name 'json' is not defined

另外,如果我的处理功能是指在相同脚本的功能,我会得到一个错误,有作为:

def process(): 
    return generateResponse() 

def generateResponse(): 
    return "Hello" 

...给我一个错误:

global name 'generateResponse' is not defined

这是命名空间的一个问题?怎么json(这是一个标准的python包)没有被识别?任何意见,将不胜感激!

+3

这听起来像是一个非常糟糕的主意......并且几乎100%肯定有更好的方法来处理你正在尝试做的任何事......为什么不仅仅是从'my_script导入过程'? –

+0

您能否提供您正在尝试执行的脚本的完整示例?这可能只是一个缺少的进口声明。 – pelya

+0

感谢您的建议。我最终将代码字符串转储到临时文件中 - 虽然不理想,但它似乎工作得很好。我不能使用“从myscript导入过程”,因为我只知道运行时的文件名,但我已经为导入文件运行时的解决方案添加了注释。 –

回答

1
import subprocess 

subprocess.call(["python","C:/path/to/my/script.py"]) 

我建议不要这样,只是使用import

这也是假设您的PYTHONPATH设置在您的环境变量中。

+0

谢谢!从字符串执行完整的代码将是理想的,但将其转储到临时文件中似乎也可以正常工作。我在这里列出了一个解决方案:http://stackoverflow.com/questions/67631/how-to-import-a-module-given-the-full-path 特别是,这一个: 'spec = importlib .util.spec_from_file_location(“myScript”,fullPath) myModule = importlib.util.module_from_spec(spec) spec.loader.exec_module(myModule)' –