2012-02-10 12 views
5

Py2exe'yi kullanarak bir Windows .exe'e derlediğim bir python programı var. Inno Setup kullanarak, bir Windows yükleyici oluşturun.Komut dosyasının çalışma klasörünü Windows'ta Python için import() yoluna eklemenin en iyi yolu?

Programımın yapısı, daha sonra __import__() bildirimi kullanılarak içe aktarılan eklentileri kullanacak şekildedir. Bu eklentiler, programımın .exe dosyasının bulunduğu bir alt klasör olarak bulunan bir 'eklenti' klasöründe bulunur. kullanıcı Windows'un aracılığıyla programı başladığında bu çalışma değildi, ancak

sys.path+= ['.'] 

:

Şimdi, programın eklentileri bulmak için, daha önce dosyama üstündeki somwhere aşağıdaki ifadeyi vardı 'Başlat menüsü, çünkü çalışma klasörü başlangıç ​​menüsüne (.exe'nin bulunduğu yerine) ayarlanmıştı. Yani '.' istediğimi çözmedi. __import__() Açıklamada .exe bulunduğu klasörde görünecek biçimde

Ben, aşağıdakilere ifadeyi değiştirerek düzelttim (argv[0] yürütülebilir tam yolu olduğu için):

sys.path+= [os.path.dirname(sys.argv[0])] 

Ancak doğru çözümü seçip seçmediğimi bilmiyorum. Özellikle de programımın çapraz platform olması (Windows, OSX, Linux) ve sys.argv documentation, argv [0] hakkında 'işletim sisteminin tam bir yol adı olup olmadığına bağlı olduğunu' söylüyor.

Bunu farklı şekilde çözmeli miyim yoksa benim yaklaşımım tamam mı?

cevap

0

Lütfen modülün __file__'unu kullanın. Bu sys.path içinde modülün üst dizini katacak

sys.path+=os.path.dirname(mymodule.__file__)

gibi Sen yazabilirsiniz.

+3

Hmm, Windows için "__file__" döndüğünden ikna olmadım.exe programı: 'C: \ Program Dosyaları (x86) \ myprogram \ myprogram.exe \ core.pyc'. Bu, OSX, Linux'ta, hatta terminalden çalışırken bile söz konusu olmayan iki yoldan ('core.pyc' ve' myprogram.exe') çıkmamı gerektiriyordu. – Rabarberski

+1

O halde en iyi çözüm, @SpencerRathbun – Nilesh

1

Sık sık bu kullanın: o dizin var dan size komut dosyasını çalıştırın geliştirme ortamı, tutarlı çalışma zamanını yapan

os.chdir(sys.argv[0].rsplit(os.sep, 1)[0]) 

. yol dışı ASCII sembolleri içerdiğinden

def executable_path(): 
    self_file = unicode(sys.argv[0], sys.getfilesystemencoding()) 
    return os.path.realpath(os.path.dirname(self_file)) 

ben unicode kullanıyorum: Benim içinde

+0

Makes sense tarafından yapılan bir yapılandırma dosyasıdır. Neden "rsplit" yaklaşımınız yerine 'os.path.dirname (sys.argv [0])' seçeneğini kullanmıyorsunuz? 'Dirname' yaklaşımı bana daha fazla kendini belgelendiriyor gibi görünüyor ve belki de bazı özel (çapraz platform) vakaları yakalıyor. – Rabarberski

3

ben sizinkine çok benzer bir kod kullanıyorum, Qt programlari .exe derlenmiş. Bu da tam bir yol ya da

os.path.realpath olup bağımlı

sys.argv [0] o operasyon sistemi bu sorunu çözer.

3

Neden config dosya uzantılarına giden yolu yok? Bu, kullanıcının onu taşımasına izin verir ve her os için bir tane alabilirsin. Yürütülebilir dosya ile veya belki birkaç iyi kullanılmış konum, linux üzerinde ~ veya/etc ve Windows'ta% homepath% ile yapıştırın.

+0

Evet, gelecekteki bir özellik olarak bunun gibi bir şey planlıyorum. Ancak bu arada, tek bir konumun (yürütülebilir dosyaya göre) doğru şekilde çalışmasının daha temel bir çözümüne sahip olmak istiyorum. Önerin için teşekkürler! – Rabarberski

+1

doğru. Pencerelerin altındaki eklentiler her halükarda% APPDATA% 'da sonuçlanmalıdır ... –

+1

@Rabarberski İstediğiniz basit bir çözümse, eklentileri exe ile aynı klasörde yaşamaya ne dersiniz? –

İlgili konular