将变量从一个python脚本导入另一个

时间:2013-10-10 07:05:10

标签: python python-2.7

script1.py调用了script2.py (subprocess.call([sys.executable, "script2.py"])。但script2.py需要x中已知的变量script1.py。我尝试了一个非常简单的import x from script1,但似乎没有用。

这是正确的使用方法吗? 例如:

#script1.py
import subprocess, sys
##subprocess.call([sys.executable, 'C:\\...\\Desktop\\script2.py'], shell=True)
##os.system("C:\\...\\Desktop\\script2.py")
subprocess.Popen("C:\\...\\Desktop\\script2.py", shell=True)
print "BLAH"
x = BO

#script2.py
from script1 import x
print "HELLO"
print x

调用script2(subprocess.call,os.system,subprocess.Popen)的所有3个案例都不起作用。我得到“BLAH”而不是“HELLO”。

7 个答案:

答案 0 :(得分:23)

正确的语法是:

from script1 import x

因此,字面意思是“从script1.py导入”x“对象。”

答案 1 :(得分:5)

试试这个:

from script1 import x

我刚刚运行了以下代码片段,但它确实有用

<强> SCRIPT1:

c = 10

<强> SCRIPT2:

from script1 import c
print c

第二个脚本按预期打印整数10。

10月17日编辑: 目前代码将不会产生指示的“Hello”或将进入无限循环。几个问题:

目前看,BO未定义。执行script1时,将打开script2的子进程。当script2调用script1时,它将打印出blah但在x = BO时失败,因为BO未定义。

所以,如果你通过用一个字符串指定BO来修复它,它将进入一个无限循环(每个脚本调用另一个脚本并打印x,Hello和Blah)。

解决这个问题的一种可能方法是通过函数调用传递x。因此,script2可以将x作为函数参数,并做任何你需要做的事情。

答案 2 :(得分:4)

您的代码正在循环,因为subprocess.Popen调用在模块初始化代码中,因此在导入script1时将由script2调用(创建一个同时导入script1的新脚本2进程...)

使用python文件作为脚本和模块的

The recommended way是使用__name__变量

#script1.py

x = BO

if __name__ == "__main__":
    import subprocess, sys
    subprocess.Popen("C:\\...\\Desktop\\script2.py", shell=True)
    print "BLAH"

但也要考虑这只适用于常量。如果x可以在运行时更改,则需要实际的进程间通信方法。

答案 3 :(得分:2)

script1.py:

x = 2
from script2 import *

script2.py:

from script1 import x
print x

答案 4 :(得分:2)

脚本0:

#!/usr/bin/env python
from script1 import x

print x

脚本1:

#!/usr/bin/env python
x = "Hello world"

输出:

Hello world

所以是的,它确实有效,不需要子流程。

答案 5 :(得分:0)

我认为你必须通过在script2.py

中为其模块名称(即script1.x)添加前缀来引用该变量

答案 6 :(得分:0)

所使用的方法比必要的方法复杂。修复BO(假设它是字符串文字,所以我引用了它)之后,并假设脚本位于同一位置,则可以调用script2并获得所需的结果。

请参阅以下内容:

#script1.py
print "BLAH"
x = "BO"

#script2.py
from script1 import x
print "HELLO"
print x

$ python script2.py 
BLAH
HELLO
BO