从模块调用方法

Posted

技术标签:

【中文标题】从模块调用方法【英文标题】:Calling method from module 【发布时间】:2015-12-19 10:52:58 【问题描述】:

我是 python 新手,在让我的代码正常工作时遇到问题。

我有两个不同的模块,在模块 a.py 中我放置了所有的方法,在模块 b.py 中我放置了逻辑。

我使用的开发环境是Sypder。

# module a
import serial
ser = serial.Serial()
def serWrite ( str ):
    ser.write (str + "\x0D")
    print "Write data :",  str + "\x0D"  
    time.sleep(0.1)
    return

def configuration():
    flagAT = 0
    while (flagAT == 0):
        serWrite("at")
        while True:
            ok = ser.readline()
            if (ok[0:2] == "OK"):
                print ("AT OK, DEVICE CONNECTED" + "\x0D")
                flagAT = 1
                break
            else:
                   print "DEVICE NOT CONNECTED OR NOT WORKING"

                   break
    print("Starting with configuration")

模块 b.py:

#module b
import serial
import a

ser = serial.Serial()
ser.port = "/dev/ttyS1"
ser.baudrate = 115200
### more serial configuration here###

try: 
    ser.open()
except Exception, e:
    print "error open serial port: " + str(e)
    exit()

configuration()

现在的问题: 当我在运行 a.py INSIDE Spyder 之后运行模块 b.py 时,一切都按预期工作。

但是:Spyder 代码分析告诉我

'a' imported but unused

当我尝试调用模块 b.py OUTSIDE Spyder 时出现以下错误

pi@(none) ~/WorkingDirectory $ python b.py
Traceback (most recent call last):
File "b.py", line 83, in <module>
configuration()
NameError: name 'configuration' is not defined

导入配置():

import a
a.configuration()

给出以下错误:

Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "/usr/lib/python2.7/dist-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 540, in runfile
 execfile(filename, namespace)
 File "/home/workingDirectory/test.py", line 85,     in    <module>
a.configuration()
File "a.py", line 336, in configuration
serWrite("at")
File "a.py", line 16, in serWrite
ser.write (str + "\x0D")
File "build/bdist.linux-i686/egg/serial/serialposix.py", line 490, in write
serial.serialutil.SerialException: Attempting to use a port that is not open

我不明白为什么我的程序在 spyder 中运行没有问题,但在外部没有问题。 有人可以帮忙吗?

【问题讨论】:

模块 b 中需要 from a import configuration。 Spyder 没有产生错误,因为您在 same 解释器中执行了这两个脚本。 @HuazuoGao 那不等于import a然后a.configuration()(他说他在问题中这样做了)? @HuazuoGao 这返回与import a相同的错误 【参考方案1】:

您需要将模块 b 更改为:

#module b
import serial
from a import ser, configuration

#ser = serial.Serial()
ser.port = "/dev/ttyS1"
ser.baudrate = 115200
### more serial configuration here###

try: 
    ser.open()
except Exception, e:
    print "error open serial port: " + str(e)
    exit()

configuration()

【讨论】:

非常感谢!这对我帮助很大

以上是关于从模块调用方法的主要内容,如果未能解决你的问题,请参考以下文章

无法从 Python C API 中内置的模块调用方法

从辅助域调用主应用域中的方法并获取值

可以从需要模块调用下划线去抖动吗?

我可以在 Ruby 模块上调用实例方法而不包含它吗?

有没有更好的方法以更短的行从网络上抓取 MSFT 数据?我已经尝试过了,但得到的问题是“模块”对象不可调用

maven一模块字段调用另一个模块数据生成下拉框