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

2024-04-24 23:54:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在写一个程序来控制一个摄像头连接到两个步进电机从树莓圆周率。我是用python编写的,我在理解全局变量(或者python中的名称)时遇到了困难。我查阅了一些关于范围和全局变量的内容,但我对用python编程真的很陌生,对我来说这并不完全有意义。我有一个程序“MainProgram”给一个变量赋值,然后这个程序从一个模块“stepper”调用一个函数。该函数需要使用D\u Alt。我在主程序中将D\u 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
>>> 

Tags: ofinimportnumbermoveosshresult
1条回答
网友
1楼 · 发布于 2024-04-24 23:54:44

global语句是一个声明,它适用于整个当前代码块。这意味着列出的标识符将被解释为全局标识符。你知道吗

您仍然需要在某个地方定义标识符。这是您得到的错误:global name 'D_Alt' is not defined,您尚未定义变量。你知道吗

通过在模块根中而不是在函数或其他代码块中定义变量,可以使整个模块以只读方式访问它。但是,要在不同的代码块中修改它,需要在该代码块中声明为global。你知道吗

试试这个:

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的信息:https://docs.python.org/2/reference/simple_stmts.html#global

相关问题 更多 >