如何使用另一个python脚本文件中的参数执行python脚本文件

时间:2010-11-20 01:19:51

标签: python

我的问题是我想用另一个python文件中的参数执行一个python文件来获取返回的值....

我不知道我是否已经解释得很好......

示例:

从shell执行

          getCameras.py "path_to_the_scene"

这会给我一个相机列表......

那么如何从另一个脚本中调用这个脚本(包括参数)???

我一直试图通过阅读其他一些问题来解决这个问题,但是我没有把它弄好,我应该使用execfile()函数吗?怎么样?

提前感谢帮助像我这样的新手!!

好的,看看你的答案后,我必须编辑我的问题,使其更简洁,因为我不明白一些答案(对不起,就像我说我是新手!!!):< / p>

好吧,我有两个脚本“getMayaCameras.py”和“doRender.py”以及一个名为“renderUI.py”的脚本,用于实现GUI中的前两个脚本。

“getMayaCameras.py”和“doRender.py”都是可以通过添加参数(或“doRender.py”情况下的标志)直接从系统shell执行的scipts,如果可能的话,我想仍然有这个可能性所以我可以选择执行UI或从shell直接执行脚本

我已经通过从“renderUI.py”脚本导入它们来对它们进行了一些修改,但现在它们不能自己工作....

那么可以让这些脚本自己工作并且还有可能从另一个脚本调用它们吗?怎么样?您之前告诉我的“将逻辑与命令行参数处理分离”对我来说听起来不错,但我不知道如何在我的脚本上实现它(我试过但没有成功).. ..

这就是为什么我在这里发布原始代码供您查看我是如何制作它的,我们可以自由地批评和/或更正代码来解释我应该如何使脚本正常工作...

#!/usr/bin/env python

import re,sys

if len(sys.argv) != 2:
    print 'usage : getMayaCameras.py <path_to_originFile> \nYou must specify the path to the origin file as the first arg'
    sys.exit(1)


def getMayaCameras(filename = sys.argv[1]): 
    try:
        openedFile = open(filename, 'r')
    except Exception:
        print "This file doesn't exist or can't be read from"
        import sys
        sys.exit(1)

    cameras = []    
    for line in openedFile: 
        cameraPattern = re.compile("createNode camera")     
        cameraTest = cameraPattern.search(line) 
        if cameraTest:      
            cameraNamePattern = re.compile("-p[\s]+\"(.+)\"")           
            cameraNameTest = cameraNamePattern.search(line)         
            name = cameraNameTest.group(1)          
            cameras.append(name)            
    openedFile.close()

    return cameras      

getMayaCameras()

再次感谢,

大卫

5 个答案:

答案 0 :(得分:41)

最佳答案是。将您的getCameras.py写为

import stuff1
import stuff2 
import sys

def main(arg1, arg2):
    # do whatever and return 0 for success and an 
    # integer x, 1 <= x <= 256 for failure

if __name__=='__main__':
    sys.exit(main(sys.argv[1], sys.argv[2]))

从您的其他脚本中,您可以执行

import getCamera

getCamera.main(arg1, arg2)

或调用getCamera.py中的任何其他函数

答案 1 :(得分:10)

首先,我同意其他人的意见,你应该编辑你的代码,将逻辑与命令行参数处理分开。

但是如果您正在使用其他库并且不想编辑它们,那么知道如何在Python中执行等效的命令行工作仍然很有用。
解决方案是os.system(命令)
在Windows上,它会调出一个控制台并执行命令,就像在命令提示符中输入命令一样。

import os
os.system('getCameras.py "path_to_the_scene" ')

答案 2 :(得分:2)

使用os.system()可能更可取的另一种方法是使用发明的subprocess模块替换os.system()以及其他一些稍微较旧的模块。以下程序是您要使用某个主程序调用的程序:

import argparse

# Initialize argument parse object
parser = argparse.ArgumentParser()

# This would be an argument you could pass in from command line
parser.add_argument('-o', action='store', dest='o', type=str, required=True,
                    default='hello world')

# Parse the arguments
inargs = parser.parse_args()
arg_str = inargs.o 

# print the command line string you passed (default is "hello world")
print(arg_str)

将上述程序与主程序中的子过程一起使用将如下所示:

import subprocess

# run your program and collect the string output
cmd = "python your_program.py -o THIS STRING WILL PRINT"
out_str = subprocess.check_output(cmd, shell=True)

# See if it works.
print(out_str)

在一天结束时,这将打印"THIS STRING WILL PRINT",这是您传递给我称为主程序的那个。 subprocess有很多选项,但值得使用,因为如果你使用它,你的程序将与系统无关。请参阅subprocessargparse的文档。

答案 3 :(得分:0)

execfile()在另一个脚本中运行一个脚本,这不是你想要的。 subprocess模块可以用来运行Python解释器的另一个实例,但你应该做的是查看getCameras.py,看看是否有一些函数可以在导入后调用。

答案 4 :(得分:0)

我建议你重新组织你的getCameras.py,将get camera list代码包装在一个名为get_cameras()的方法中。然后你可以在其他python脚本中调用这个方法。

getCameras.py

def get_cameras():
bulabula...
if __name__ == '__main__':
return get_cameras()

如何使用:other.py

import getCameras
camera_list = getCameras.get_cameras()