Python 如何在主程序中定义的模块中使用变量?

Python 如何在主程序中定义的模块中使用变量?,python,Python,我正在写一个程序来控制一个连接到两个步进电机的摄像头。我是用python编写的,我在理解全局变量(或者python中的名称)时遇到了困难。我查阅了一些关于作用域和全局变量的内容,但我对python编程非常陌生,这对我来说并不完全有意义。我有一个程序“MainProgram”,它给变量D_Alt赋值。这个程序然后从模块“stepper”调用一个函数。该函数需要使用D_Alt。我在主程序中将D_Alt设置为全局变量,但仍然出现错误。如何设置D_Alt,以便主程序和模块可以使用它 以下是我的主程序代码

我正在写一个程序来控制一个连接到两个步进电机的摄像头。我是用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()和你使用的任何其他函数中。否则它将是只读的。