如何使用一个Python脚本来运行另一个Python脚本并向其传递变量?

3
我有一个Python脚本,我们称它为controller.py。我想使用controller.py运行另一个Python脚本并传递几个变量给它。我们称第二个脚本为analyzer.py
在不将analyzer.py作为模块导入的情况下,最佳方法是什么?如何在analyzer.py中引用我传递给它的变量?
这是我使用subprocess尝试失败的代码: controller.py
import subprocess

var1='mytxt'
var2=100
var3=True
var4=[['x','y','z'],['x','c','d']]
var5=r"C:\\Users\\me\\file.txt"

myargs=var1,var2,var3,var4,var5
my_lst_str = ' '.join(map(str, myargs))
my_lst_str ='python analyzer.py '+my_lst_str

subprocess.call(my_lst_str,shell=True)

analyzer.py

print 'Argument List:', str(sys.argv)

我在 Stack Overflow 上查看了类似的问题。一个经常推荐的解决方案是尝试将 analyzer.py 作为模块导入,但是 analyzer.py 定义了许多不同的函数。将其作为模块使用会创建许多嵌套函数,并且管理那些嵌套函数内的变量范围很麻烦。

我需要在这些脚本中使用 Python 2。我正在使用 Windows 10 机器。


2
这个回答解决了你的问题吗?从另一个脚本中调用脚本的最佳方法是什么? - undefined
1
我真的不太明白如何将analyzer.py作为模块导入会创建嵌套函数。嵌套函数是在另一个函数内定义的函数。也许在这里分享一些实际的代码会更有意义。如果你坚持不导入analyzer.py,也许可以使用subprocess将其作为单独的Python进程运行。 - undefined
2
导入模块是很正常的,不应该让人感到繁琐。 - undefined
1
@thgro 你是说 from analyzer import * 吗?因为那样会导入所有内容。如果你只想要模块中的一个函数,只需要导入那个函数,例如 from analyzer import the_function。尽量少使用全局变量(最好是零:常量可以,但最好将它们定义为枚举)。如果一个函数需要一个变量,将其作为参数传递进去。如果你一直在传递相同的参数,可以将它们分组成一个class或者一个namedtuple - undefined
1
@thgro 不只是所谓的“最佳实践”,这是正常操作。如果你做了一些不同的事情,需要费尽周折才能让代码可重用,那肯定是出了问题。修复你的代码,直接调用你需要的函数即可。 - undefined
显示剩余7条评论
1个回答

10

1- exec 命令:

Python2:

execfile('test.py')

Python3:

exec(open('test.py').read())

2- os命令:

test1.py:

import os 

#os.system('python test2.py')
os.system("python test2.py arg1 arg2")  

test2.py:

import sys

print 'Number of arguments:', len(sys.argv), 'arguments.'
print 'Argument List:', str(sys.argv)

3- subprocess 命令:

from subprocess import call
call(["python", "test.py"])

要传递参数和执行shell命令,请使用subprocess(请参见此链接):

import subprocess

# Simple command
subprocess.call(['ls', '-1'], shell=True)

另一个示例代码:

file1.py:

args ='python file2.py id ' + 1
subprocess.call(args)

file2.py:

import sys

print 'Number of arguments:', len(sys.argv), 'arguments.'
print 'Argument List:', str(sys.argv)

4- socket编程:在两个或多个Python文件之间共享数据时,可以使用socket编程:请参见此链接


谢谢你,Taher。我在我的问题中添加了一些代码,尝试使用subprocess。你能告诉我这段代码哪里出错了吗? - undefined
在analyzer.py中导入sys,并且移除subprocess.call(my_lst_str,shell=True)中的shell=True参数 => subprocess.call(my_lst_str),然后测试你的代码。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接