2013-07-28 14 views
6

Bir Python komut dosyasının yolunu içeren bir diziniz olduğunu ve bu betiği saydam bir şekilde yüklemek ve yürütmek istediğinizi varsayalım (böylece iç komut dosyası için doğrudan “python yolu” ile çalıştırılmak üzere karşılaştırılmamış temel farklar bulunmayacaktır). Ve sonra ortaya çıkan küresel dict olsun. Ben runpy.run_path() bunu yapar ama iki sorun var olduğunu düşündüm. Yol bazı unicode karakterleri içeriyorsa, çalışmaz (bkz. http://bugs.python.org/issue17588). Ve en önemlisi, küresel dict verilen sadece orijinal bir kopyasıdır, çünkü bu orijinal bir nesne geçici modül nesnesi çöp toplandığında tasfiye edilir. Yani bir işlev nesnesi __globals__ dict bozuk (bkz. http://bugs.python.org/issue18331).Başka bir komut dosyasından nasıl bir Python betiği çalıştırın ve sonuçta global dict olsun?

İç yazıyı nasıl çalıştıracağınıza dair herhangi bir fikriniz var mı?

Güncelleştirme: Geçerli yaklaşıma bakın - http://bpaste.net/show/RzAbQxLNXiJsXYm2fplz/. Baska öneri? İyileştirmeler? Örneğin, çalıştırılan betiğin bakış açısından farklı olabilecek detaylar. __main__’e yükleme ile ilgili sorunları biliyorum. Bir modül içe

+3

kullanılarak daha iyi sonuçlar açıklanmaktadır ... – l4mpi

+0

[execfile()] (http://docs.python.org /2/library/functions.html?highlight=execfile#execfile). – martineau

+0

@ l4mpi: Yol ve iç komut dosyası sabit değil. – user87690

cevap

1

üst düzeyde kod çalıştırır ve çalıştırmak istediğiniz kodu üst düzeyde olması durumunda modülün "global" ad modülü

[email protected]:~$cat test.py 
def func(): 
    pass 

myname = "michael caine" 

print "hello, %s" % myname 
[email protected]:~$python 
Python 2.7.5 (default, Jul 12 2013, 18:42:21) 
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import test 
hello, michael caine 
>>> dir(test) 
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'func', 'myname'] 
>>> 

adı olarak içe aktarıldığını Dosyanın, sadece modülün içe aktarılması, ve kodlarını çalıştırır ve "global" ad alanına tek bir kullanışlı pakette erişmenizi sağlar. Çalıştırmak istediğiniz kodu üst düzeyde değilse (yalnızca ortak if __name__=="__main__" hile ile tetiklenen alır bir main() fonksiyonunda ise örneğin), o fonksiyonu kendine çağırabilir: Elbette

[email protected]:~$cat test.py 

def main(): 
    print "hello there!" 

if __name__=="__main__": 
    main() 
[email protected]:~$python 
Python 2.7.5 (default, Jul 12 2013, 18:42:21) 
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import test 
>>> test.main() 
hello there! 
>>> 

, import etmek istediğiniz dosyanın sys.path içinde olmaması mümkündür, bu yüzden import ile kolayca yüklenemez. Basit bir çözelti sys.path işlemek için olabilir, ama How to import a module given the full path? bir modül olarak kullanılabilir olması için imp.load_source()

"iç" senaryoyu yeniden
+0

Bu, yalnızca komut dosyasının üst düzey mantığı, eğer '__name__ == "__main __" 'boilerplate' den çağrılan bir işlevdeyse çalışacaktır. Bu iyi bir tasarım olsa da, başka bir kod tarafından kullanıldığına güvenemeyebilirsiniz. – Blckknght

+0

Bu doğru, 'main() 'işlevini çağırmak, sadece çalıştırmak istediğiniz kod' main() 'işlevinin içinde ise yararlı olacaktır. Farklı bir işlev içinde ise, bunun yerine bu işlevi çağırmanız gerekir. Eğer işlev argümanları alırsa, bunları da sağlamanız gerekir. –

+0

Komut dosyasının yolu var, yüklenecek sys.path içinde olmayabilir. Ayrıca bu bir unicode dosya adı için çalışmaz, çünkü bir hata vardır, böylece “import α” yapamazsınız. – user87690

İlgili konular