繁体   English   中英

在python脚本之间传递变量

[英]Pass variable between python scripts

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

感谢您到目前为止的评论。

调用脚本时,调用脚本可以访问被调用脚本的命名空间。 (在您的情况下, first可以访问second的命名空间。)但是,您要求的是另一种方式。 您的变量在调用脚本中定义,并且您希望被调用脚本访问调用者的命名空间。

在这个 SO 帖子中,问题本身已经给出了答案:

调用模块的访问命名空间

但我只会在你的上下文中解释它。

要在您的情况下获得您想要的内容,请使用以下行开始调用脚本:

from __main__ import *

这允许它访问调用者脚本的命名空间(所有变量和函数)。

所以现在你的调用脚本和以前一样:

x=5
import second

被调用的脚本是:

from __main__ import *
print x

这应该可以正常工作。

使用以下脚本:

第一个.py:

x=5

第二个.py

import first
print first.x

这将打印 x 值。 应使用脚本名称引用始终导入的脚本数据,例如first.x

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

尝试使用 exec Python3.5:

第一个.py

x=5
exec(open('second.py').read())

第二个.py

print(x)

您还可以使用以下方法传递 x:

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

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

最后,

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM