2016-04-01 18 views
0

Bir programın çıktı dosyalarını başka bir dosyanın giriş dosyalarına dönüştüren küçük bir komut dosyası yazıyorum.Dinamik olarak içe aktarma dosyası

Bu giriş dosyalarını oluşturmak için bazı ek kullanıcı girişi gereklidir. Bu girişin ayrı bir dosyada olmasını istiyorum. Komut dosyası çalıştırıldığında, kullanıcı konfigürasyon dosyasını sys.argv üzerinden bir dizi olarak belirtebilir.

yapılandırma dosyası sadece değişkenleri değil, işlevleri içerir:

bir dize tarafından verilen bir dosyada değişkenleri almak için en iyi yöntem şimdi ne
N_a = 2 
N_b = 5 
N_c = ... 
. 
. 
. 

? Ve en önemlisi: Kullanıcının iki çalışma arasında bir şeyi değiştirmesi durumunda betiğin yürütüldüğü her seferinde bu dosya yeniden yüklenmelidir. Her rasgele dosya için bunu yapmak mümkün mü yoksa bir .py dosya olması gerekiyor mu?

+2

'configparser' modülünü kullanmayı düşündünüz mü? Modülde açıklanan sözdizimini kullanarak bir yapılandırma dosyası oluşturabilir ve onu ayrıştırmak için kullanabilirsiniz. – chapelo

cevap

2

Sorunuzu yanıtlamak için, rastgele bir dizeyi almak ve bunu python kodu olarak değerlendirmek için eval'u kullanabilirsiniz. Alternatif olarak, rasgele bir dizeyi python ifadesi olarak çalıştırmak için exec'u kullanabilirsiniz. Genelde

, bu o program savunmasız hale getirir olarak, bunu yapmak için tavsiye edilmez - Biri kod bu eval veya exec fonksiyonu kullanılarak biliyordum hayal, kötü niyetli bir kullanıcı yapılandırma dosyasında bazı piton kodu eklemek olabilir ve bazı gerçek hasarlarınızı sisteminizde yapın.

Yapmak istediklerim, kullanıcının yapılandırma dosyasını ayrıştırmak ve değişkenleri uygun şekilde ayarlamak olduğunu düşünüyorum. Örneğin:

# file configParser.py 
userfile = 'users_file.txt' 
values = {} 
with open(userfile, 'r') as infile: 
    for line in userfile: 
     name, value = line.strip().split('=') 
     values[name] = value 

Ardından daha sonra bu değerleri erişmek için values dicti kullanabilirsiniz: saklanan değerler dizeleri olduğunu

values['N_a'] # holds '2' 
values['N_b'] # holds '5' 
# etc... 

Not. Bunları int s veya float s veya w/e'ye istediğiniz gibi dönüştürebilirsiniz.

Akılda tutulması gereken bir şey, bu yaklaşımın her zaman bir satırın variable_name = value modelinden oluştuğunu varsaymasıdır. Kullanıcı bu kalıptan saparsa veya geçersiz bir değer sağlaması durumunda, çözümleyici büyük olasılıkla kilitlenecektir. Kullanıcının programınıza veri sağlamak için kullanabileceği bir yapılandırma dosyası formatı belirtmenize olanak tanımak amacıyla, configparser gibi çeşitli modüller vardır.

+1

Mükemmel cevap :) + configparser recomendation –

1
en güvenli elle dosyayı ayrıştırmak olacaktır

...

ama kesinlikle kullanabilirsiniz

execfile("/path/to/a.py") 

rağmen .. ve evet onun biten sen .blah, .conf istersen olabilir, ...

İlgili konular