Python 如何在主程序中定义的模块中使用变量?
我正在写一个程序来控制一个连接到两个步进电机的摄像头。我是用python编写的,我在理解全局变量(或者python中的名称)时遇到了困难。我查阅了一些关于作用域和全局变量的内容,但我对python编程非常陌生,这对我来说并不完全有意义。我有一个程序“MainProgram”,它给变量D_Alt赋值。这个程序然后从模块“stepper”调用一个函数。该函数需要使用D_Alt。我在主程序中将D_Alt设置为全局变量,但仍然出现错误。如何设置D_Alt,以便主程序和模块可以使用它 以下是我的主程序代码:Python 如何在主程序中定义的模块中使用变量?,python,Python,我正在写一个程序来控制一个连接到两个步进电机的摄像头。我是用python编写的,我在理解全局变量(或者python中的名称)时遇到了困难。我查阅了一些关于作用域和全局变量的内容,但我对python编程非常陌生,这对我来说并不完全有意义。我有一个程序“MainProgram”,它给变量D_Alt赋值。这个程序然后从模块“stepper”调用一个函数。该函数需要使用D_Alt。我在主程序中将D_Alt设置为全局变量,但仍然出现错误。如何设置D_Alt,以便主程序和模块可以使用它 以下是我的主程序代码
from astropy.io import fits
import os
import RPi.GPIO as GPIO
import time
import math
import sys
import stepper
global In_Alt, In_Az, C_Alt, C_Az, D_Alt, D_Az
#start server and get initial position
os.system("indi.sh")
os.system("indi.takepic.sh %s %s" %(15, "InitialPosition"))
os.system("platesolve.sh %s" %("InitialPosition"))
stepper.initPosition()
stepper.initPins()
list_of_stars = [[0,0],[1,1],[2,2]] #star in list_of_stars is [RA,D]
for star in list_of_stars:
D_Az=star[0] #
D_Alt=star[1]
print D_Az
print D_Alt
stepper.moveMotor()
for x in range(0,10):
os.system("indi.takepic.sh {0}+str(x) .format(list_of_stars[star])") #take pic with 15s exposure and rename with name of star and number
stepper.resetPosition()
os.system("indi.takepic.sh 15 ResetPosition")
os.system("platesolve.sh ResetPosition")
GPIO.cleanup()
sys.exit(0)
这是我需要使用的模块中的函数:
def moveMotor():
#move altitude motor
global D_Alt
result = D_Alt - C_Alt #find number of steps to move
if(result>0): #if number of steps is positive, move forward
steps = result
forward(int(delay) / 1000.0, int(steps), C_Alt)
C_Alt = C_Alt + steps
else: #if number of steps is negative, move backward
steps = abs(result) #steps must be positive, so turn result into positive number
backwards(int(delay) / 1000.0, int(steps), C_Alt)
C_Alt = C_Alt - steps
我得到的错误是:
Traceback (most recent call last):
File "/home/pi/Stepper_Motors/MainProgram.py", line 25, in <module>
stepper.moveMotor()
File "/home/pi/Stepper_Motors/stepper.py", line 149, in moveMotor
result = D_Alt - C_Alt #find number of steps to move
NameError: global name 'D_Alt' is not defined
>>>
回溯(最近一次呼叫最后一次):
文件“/home/pi/Stepper_Motors/MainProgram.py”,第25行,输入
步进电机
文件“/home/pi/Stepper\u Motors/Stepper.py”,第149行,在moveMotor中
结果=D_Alt-C_Alt#查找要移动的步数
NameError:未定义全局名称“D_Alt”
>>>
全局语句是一个声明,适用于整个当前代码块。这意味着列出的标识符将被解释为全局标识符
您仍然需要在某处定义标识符。这是您得到的错误:未定义全局名称“D_Alt”
,您尚未定义变量
通过在模块根中而不是在函数或其他代码块中定义变量,可以使整个模块以只读方式访问该变量。但是,要在不同的代码块中修改它,需要在该代码块中将其声明为全局
试试这个:
from astropy.io import fits
import os
import RPi.GPIO as GPIO
import time
import math
import sys
import stepper
# Defining the variables
In_Alt = None
In_Az = None
C_Alt = None
C_Az = None
D_Alt = None
D_Az = None
delay = None
def forward(someArgs):
.. your implementation ..
def backwards(someArgs):
..your implementation..
def moveMotor():
#move altitude motor
global D_Alt, C_Alt, delay
result = D_Alt - C_Alt #find number of steps to move
if(result>0): #if number of steps is positive, move forward
steps = result
forward(int(delay) / 1000.0, int(steps), C_Alt)
C_Alt = C_Alt + steps
else: #if number of steps is negative, move backward
steps = abs(result) #steps must be positive, so turn result into positive number
backwards(int(delay) / 1000.0, int(steps), C_Alt)
C_Alt = C_Alt - steps
# start server and get initial position
os.system("indi.sh")
os.system("indi.takepic.sh %s %s" % (15, "InitialPosition"))
os.system("platesolve.sh %s" % ("InitialPosition"))
stepper.initPosition()
stepper.initPins()
list_of_stars = [[0, 0], [1, 1], [2, 2]] # star in list_of_stars is [RA,D]
for star in list_of_stars:
D_Az = star[0] #
D_Alt = star[1]
print D_Az
print D_Alt
stepper.moveMotor()
for x in range(0, 10):
os.system(
"indi.takepic.sh {0}+str(x) .format(list_of_stars[star])") # take pic with 15s exposure and rename with name of star and number
stepper.resetPosition()
os.system("indi.takepic.sh 15 ResetPosition")
os.system("platesolve.sh ResetPosition")
GPIO.cleanup()
sys.exit(0)
您可以在此处找到有关
global
的更多信息:Raspi与您的问题标题无关。问题是moveMotor()函数比我包含的要大得多,因为它控制两个步进电机(每个方向一个)。我想把这个函数放到一个模块中,以使主程序更简单。正在for循环中定义D_Alt。我已经在循环中使用print函数检查过了。我尝试在moveMotor()中再次使用print函数,以查看调用该函数时D_Alt被设置为什么,但仍然会出现该错误。问题是由于某种原因,moveMotor()没有读取D_Alt的值。这是不可避免的吗?将其放入模块(甚至作为类)是正确的方法。我想说的是,创建类方法和属性将使它变得更清晰,不需要全局变量,但这取决于您。更好的变量命名约定将使代码更具可读性。(我喜欢谷歌的风格:)至于你提到的问题,记住你必须在你想要改变它的每个上下文中将变量声明为全局变量——这意味着在moveMotor()和你使用的任何其他函数中。否则它将是只读的。