我确信这很简单,但我无法让它正常工作。我需要让我的主python脚本调用另一个python脚本并将变量从原始脚本传递到我调用的脚本
因此,对于一个简单的例子,我的第一个脚本是
first.py
x = 5
import second
我的第二个脚本是,
second.py
print x
我希望它能打印x但我得到
NameError: name 'x' is not defined
我不确定导入是否是实现这一目标的正确方法,但是如果有人能以一种简单的方式阐明它,那就太棒了!
感谢,
修改
阅读评论后,我想我会扩展我的问题。 Aswin Murugesh的答案解决了我遇到的导入问题,但解决方案没有达到预期的结果,因为我似乎无法以这种方式传递列表中的项目。
在first.py中,我有一个列表,我按如下方式处理
for insert, (list) in enumerate(list, start =1):
'call second.py passing current list item'
我想将列表中的每个项目传递给第二个python文件以进行进一步处理(网页抓取),我不想在first.py中执行此操作,因为这是主要的'扫描'程序然后调用其他程序。我希望现在更有意义。
感谢迄今为止的评论。
答案 0 :(得分:24)
调用脚本时,调用脚本可以访问被调用脚本的命名空间。 (在您的情况下,第一个可以访问第二个的命名空间。)但是,您要求的是另一种方式。您的变量在调用脚本中定义,并且您希望被调用的脚本访问调用者的名称空间。
在SO帖子中,问题本身已经说明了答案:
Access namespace of calling module
但我会在你的背景下解释一下。
要获得您想要的内容,请使用以下行开始调用脚本:
from __main__ import *
这允许它访问调用者脚本的命名空间(所有变量和函数)。
所以现在你的调用脚本和以前一样:
x=5
import second
,被调用的脚本是:
from __main__ import *
print x
这应该可以正常工作。
答案 1 :(得分:8)
使用以下脚本:
first.py:
x=5
second.py
import first
print first.x
这将打印x值。应始终使用脚本名称引用导入的脚本数据,例如first.x
答案 2 :(得分:2)
尝试使用exec Python3.5:
first.py
x=5
exec(open('second.py').read())
second.py
print(x)
您也可以使用:
传递xx=5
myVars = {'x':x}
exec(open('second.py').read(), myVars)
不确定这是不是一个好方法。
答案 3 :(得分:2)
为避免命名空间污染,请单独导入所需的变量:from __main__ import x
,依此类推。否则你最终会得到你不知道的命名冲突。
答案 4 :(得分:2)
最后,
我为Python创建了一个软件包来解决此问题。
$ pip install guli
Guli不需要安装任何其他PIP软件包。
Guli可用于在不同的Python脚本之间,多个进程之间或同一脚本之间传递。 在主流程和另一个(多流程)流程之间传递变量。
import guli
import multiprocessing
string = guli.GuliVariable("hello").get()
print(string) # returns empty string ""
def my_function():
''' change the value from another process '''
guli.GuliVariable("hello").setValue(4)
multiprocessing.Process(target=my_function).start()
import time
time.sleep(0.01) # delay after process to catch the update
string = guli.GuliVariable("hello").get()
print(string) # returns "success!!!"
希望我为很多人解决了这个问题!