2016-11-04 59 views
0

我正在测试两个python脚本sunset.py,它调用gettimes.py获得两次,但我没有返回任何结果。我知道gettimes.py被称为它打印的时间,但我不能从sunset.py gettimes.py打印出来无法从python脚本获取时间

from gettimes import main 

arg1 = '' 
arg2 = '' 

main(arg1, arg2) 

print 'Hour on ', arg1 
print 'Hour off ', arg2 

sunset.py

import ephem # to get sunrise and sunset 
import datetime # import date and time modules 
import time 
import sys 

def main(arg1, arg2): 
    here = ephem.Observer() #determine position of observer 
    here.lat = 'xx.xx085057' 
    here.lon = '-x.xx781850' 
    here.elevation = 43 #meters 
    sun = ephem.Sun() #define sun as object 

    arg1 = here.next_rising(sun).datetime().strftime('%H:%M') 
    arg2 = here.next_setting(sun).datetime().strftime('%H:%M') 
    print arg1, arg2 

if __name__=='__main__': 
    sys.exit(main(sys.argv[1], sys.argv[2])) 

我在做什么错?

回答

1

Python不会按照您认为的方式引用参数(它不像C++引用语义)。这更像是通过指针传递;你可以改变接收到的对象的属性,但是如果你完全重新分配了这个名字,你就失去了指向原始对象的指针(并且本地名称不再与调用者有任何关系)。

当您重新分配arg1arg2sunset.main时,会重新触发本地名称,但调用者变量未更改。这里通常的解决办法是只返回新值,垃圾无法通过时,功能并不需要它:

def main(): 
    here = ephem.Observer() #determine position of observer 
    here.lat = 'xx.xx085057' 
    here.lon = '-x.xx781850' 
    here.elevation = 43 #meters 
    sun = ephem.Sun() #define sun as object 

    arg1 = here.next_rising(sun).datetime().strftime('%H:%M') 
    arg2 = here.next_setting(sun).datetime().strftime('%H:%M') 
    return arg1, arg2 

# I have no idea why you were passing argv stuff to main here, 
# since it's not used, but this is a not too terrible way of handling it: 
if __name__ == '__main__': 
    print(*main()) 

而且在发送方:

from gettimes import main 

arg1, arg2 = main() 

print 'Hour on ', arg1 
print 'Hour off ', arg2 
+0

谢谢你的回答,两者都有效,但我也摆脱了这里我不需要的几行,而当涉及到代码时更少 – tamus

2

字符串不可变。

试试:

import ephem # to get sunrise and sunset 
import datetime # import date and time modules 
import time 
import sys 

def main(): 
    here = ephem.Observer() #determine position of observer 
    here.lat = 'xx.xx085057' 
    here.lon = '-x.xx781850' 
    here.elevation = 43 #meters 
    sun = ephem.Sun() #define sun as object 

    arg1 = here.next_rising(sun).datetime().strftime('%H:%M') 
    arg2 = here.next_setting(sun).datetime().strftime('%H:%M') 

# print arg1, arg2 
    return (arg1, arg2) 

if __name__=='__main__': 
    sys.exit(main(sys.argv[1], sys.argv[2])) 

from gettimes import main 


arg1, arg2 = main() 

print 'Hour on ', arg1 
print 'Hour off ', arg2 
+0

我想你的意思是说“字符串不是_mutable_”或“字符串不可变”。正如所写的,你说的与你的意思相反。即使如此,字符串的可变性在这里并不相关;他们在'main'中反弹了本地名称,因此可变或不可变,它们不再与调用者传递的内容相关。 – ShadowRanger

+0

感谢您的回答 – tamus

+0

我的错误。谢谢。 – andercruzbr