2016-11-04 6 views
0

2つのpythonスクリプト、sunset.pyが2回取得するgettimes.pyを呼び出していますが、何も返されません。私はそれが回を印刷してgettimes.pyが呼び出される知っているが、私はPythonスクリプトから時間を返すことができません

from gettimes import main 

arg1 = '' 
arg2 = '' 

main(arg1, arg2) 

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

sunset.py gettimes.py 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++の参照セマンティクスではない)、参照によって引数を渡すことはありません。それはポインタを渡すようなものです。受け取ったオブジェクトの属性を変更することはできますが、名前を完全に再割り当てすると、元のオブジェクトへのポインタが失われてしまいます(ローカル名はもはや呼び出し元とは関係ありません)。 とarg2sunset.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

私はあなたが言うことを意味だと思いますmsgstr "文字列は可変ではありません"または "文字列_are_不変"です。書かれているように、あなたはあなたが意味していたのと反対のことを言った。それでも、文字列の変更はここでは関係ありません。彼らは 'main'のローカル名をリバウンドさせるので、変更可能かどうかにかかわらず、呼び出し側が渡したものにはもはや関係しません。 – ShadowRanger

+0

あなたのお返事ありがとう – tamus

+0

私の間違い。ありがとう。 – andercruzbr

関連する問題