在一个py脚本里调用另一个py脚本的问题

发布于 2022-09-05 23:38:12 字数 1683 浏览 32 评论 0

各位大虾好!小虾遇到了一个问题。

假设我有这样的一个脚本,叫one.py,内容如下:

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

a = [1, 2, 3, 4, 5, 6, 7]
b = []
c = []
d = []


def JJJ():
    global x
    x = i + 4


def QQQ():
    global y
    y = i * 2


def KKK():
    global z
    z = x - y


if __name__ == "__main__":
    for i in a:
        JJJ()
        b.append(x)
        QQQ()
        c.append(y)
        KKK()
        d.append(z)

print("======================")
print (b)
print (c)
print (d)

启动之后,是可以获得正确的结果的:

[root@zabbix opt]# python one.py
======================
[5, 6, 7, 8, 9, 10, 11]
[2, 4, 6, 8, 10, 12, 14]
[3, 2, 1, 0, -1, -2, -3]
[root@zabbix opt]# 

现在我打算写一个two.py,在two.py里获取到b、c、d的值,于是乎我就写了一个two.py:

!/usr/bin/env python
# -*- coding: UTF-8 -*-
import one
from one import a,b,c,d,JJJ,QQQ,KKK

for i in a:
        JJJ()
        b.append(x)
        QQQ()
        c.append(y)
        KKK()
        d.append(z)

print ("======================")
print (b)
print (c)
print (d)

结果执行的时候,出现这个错误:

[root@zabbix opt]# python two.py 
======================
[]
[]
[]
Traceback (most recent call last):
  File "two.py", line 7, in <module>
    JJJ()    
  File "/opt/one.py", line 12, in JJJ
    x=i+4
NameError: global name 'i' is not defined

于是我就把i添加到from one import a,b,c,d,JJJ,QQQ,KKK里,结果再启动。成了这样:

[root@zabbix opt]# python two.py 
======================
[]
[]
[]
Traceback (most recent call last):
  File "two.py", line 4, in <module>
    from one import i,a,b,c,d,JJJ,QQQ,KKK
ImportError: cannot import name i

请问我哪里错了?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

野味少女 2022-09-12 23:38:12

你的代码很难理解,并且看不出目的何在
在函数里使用循环变量就是很奇怪的事情,应该当作参数传进去,

愛上了 2022-09-12 23:38:12
[root@zabbix opt]# python two.py 
======================
[]
[]
[]
Traceback (most recent call last):
  File "two.py", line 4, in <module>
    from one import i,a,b,c,d,JJJ,QQQ,KKK
ImportError: cannot import name i

从报错可以看出,三个空列表证明了,代码确实执行了,
报错的原因是因为,参与运算要用到的变量i在one.py的 if name == '__main__' 模块下面,不会被导入,
虽然在two.py中也有一个i变量,但是他不会参与运算。因为他引用的是one.py模块中的i

谁的年少不轻狂 2022-09-12 23:38:12

你的one.py里的i是放在if name == "__main__":里的。if name == "__main__":的意思是,非引用情况下,就是说one.py作为主程序、你直接执行one.py时执行下面的代码。当你在two.py引用one.py时,if name == "__main__":就不成立了,你就得不到i。
你想通过impor引用i,但是i不是one.py的全局变量,无法引用。
现在,如果是我,我就给JJJ,QQQ,KKK三个方法添加一个参数,如:
def QQQ(i):

global y
y = i * 2

你要用这个方法的时候,把参数传进去就好了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文