我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”。
答案 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进程...)
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