33

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

感谢您迄今为止的评论。

4

5 回答 5

40

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

这个SO帖子中已经在问题本身中说明了答案:

调用模块的访问命名空间

但我将在您的上下文中解释它。

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

from __main__ import *

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

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

x=5
import second

被调用的脚本是:

from __main__ import *
print x

这应该可以正常工作。

于 2013-04-17T19:04:01.410 回答
12

使用以下脚本:

第一.py:

x=5

第二个.py

import first
print first.x

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

于 2013-04-16T22:26:53.680 回答
6

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

于 2018-04-26T13:42:00.293 回答
2

尝试使用 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)

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

于 2017-04-11T23:06:25.130 回答
1

最后,

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

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

于 2020-07-05T15:24:41.907 回答