在python脚本之间传递变量

时间:2013-04-16 22:24:37

标签: python

我确信这很简单,但我无法让它正常工作。我需要让我的主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中执行此操作,因为这是主要的'扫描'程序然后调用其他程序。我希望现在更有意义。

感谢迄今为止的评论。

5 个答案:

答案 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)

您也可以使用:

传递x
x=5
myVars = {'x':x}
exec(open('second.py').read(), myVars)

不确定这是不是一个好方法。

答案 3 :(得分:2)

为避免命名空间污染,请单独导入所需的变量:from __main__ import x,依此类推。否则你最终会得到你不知道的命名冲突。

答案 4 :(得分:2)

最后,

我为Python创建了一个软件包来解决此问题。


从PIP安装Guli。

$ pip install guli

Guli不需要安装任何其他PIP软件包。

有了包裹,您就可以

Guli可用于在不同的Python脚本之间,多个进程之间或同一脚本之间传递。 在主流程和另一个(多流程)流程之间传递变量。

  • 在不同的Python脚本之间传递变量。
  • 在“主进程”和另一个(多进程)进程之间传递变量。
  • 在同一脚本中使用变量。
  • 创建/删除/编辑-GuliVariables。

示例

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!!!"

希望我为很多人解决了这个问题!