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

Z77*_*Z77 20 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
Run Code Online (Sandbox Code Playgroud)

所有3个调用script2(subprocess.call,os.system,subprocess.Popen)的情况都不起作用.我得到"BLAH"而不是"HELLO".

Ter*_*ryA 25

正确的语法是:

from script1 import x
Run Code Online (Sandbox Code Playgroud)

所以,从字面上看,"从script1.py导入"x"对象."

  • @Quastiat 这听起来像是糟糕的设计 - 你应该始终导入常量值/函数。也许您需要复印一份? (2认同)

小智 5

试试这个:

from script1 import x
Run Code Online (Sandbox Code Playgroud)

我刚刚运行了以下代码片段并且工作正常

SCRIPT1:

c = 10

SCRIPT2:

from script1 import c
print c
Run Code Online (Sandbox Code Playgroud)

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

10月17日编辑: 现在代码将不会产生指示的"Hello"或将进入无限循环.几个问题:

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

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

修复它的一种可能方法是通过函数调用传递x.因此,script2可以将x作为函数参数,并做任何你需要做的事情.


Mih*_*tan 5

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

python 文件用作脚本和模块的推荐方法是使用__name__变量

#script1.py

x = BO

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

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


fja*_*mes 0

我认为您必须通过在 script2.py 中添加模块名称前缀(即 script1.x)来引用该变量