Python yorumlayıcısı içinde bir dosya nasıl çalıştırılır?


289

Tercüman içinde python komutları ile bir dosya yürütmek çalışıyorum.

EDIT: Ben ayrı bir işlemi çağırmak için değil, bu dosyadan değişkenleri ve ayarları kullanmaya çalışıyorum.


2
os modülü ve diğer cevapları kontrol ediyorum.
Adam Matan

2
Önerilen sistem; EDIT'i okuduğumda cevap silindi: - /
lightsong

Yanıtlar:


229

Birkaç yol.

Kabuktan

python someFile.py

IDLE içinden F5 tuşuna basın .

Etkileşimli olarak yazıyorsanız, şunu deneyin: ( yalnızca Python 2 !)

>>> variables= {}
>>> execfile( "someFile.py", variables )
>>> print variables # globals from the someFile module

Python3 için şunları kullanın:

>>> exec(open("filename.py").read())

10
pythonpython 3 çalıştırıyorsanız, python3bunun yerine çalışmaz .
pzkpfw

41
Execfile artık python3'te mevcut değil ve exec () bir şekilde çalışmıyor gibi görünüyor ... yanlış yaptığımdan emin değilim. cevabı güncelleyebilir misin?
temporary_user_name

ile yürütme komut dosyası stdinkullanmak gibi bir dosyadan sağlamak için herhangi bir yolu var mı? @ s-lott<execfile()
bhanu

9
@pzkpfw python, python'un herhangi bir sürümünü gösterebilir. Sadece python v3 ile pythonişaret eden ortamlar gördüm python3.
StockB

2
@pzkpfw Bu python, ortam değişkenindeki klasörlere bakarken sistemin hangi yürütülebilir dosyayı bulduğuna bağlıdır PATH.
HelloGoodbye

254

Python 2 için:

>>> execfile('filename.py')

Python 3 için:

>>> exec(open("filename.py").read())
# or
>>> from pathlib import Path
>>> exec(Path("filename.py").read_text())

Belgelere bakın . Python 3.0 kullanıyorsanız, bu soruya bakın .

Globals dosyasını yürüttükten sonra dosyaadı.py'dan nasıl eriştiğinize ilişkin bir örnek için @ S.Lott tarafından verilen cevaba bakın.


Okuma yöntemi ne işe yarar? Ne yazık ki resmi dokümantasyon sitesi net bir örnek ve açıklama sağlamamaktadır.
Dmitry

Dosyayı okur ve tüm içeriği tek bir dizede döndürür (varsayılan olarak), örneğin dosyadaki w3schools sayfasına bakın .
Maksimum


96

Python 2 + Python 3

exec(open("./path/to/script.py").read(), globals())

Bu bir komut dosyası yürütecek ve tüm global değişkenlerini yorumlayıcının global kapsamına (çoğu komut dosyası ortamındaki normal davranış) koyacaktır.

Python 3 execBelgeleri


1
Kahramanımsın! Os.getcwd () bir şey söyledi, ama glob ("*") başka bir dizinde çalıştı günler için gerçekten garip şeyler ile mücadele ediyorum ... Teşekkürler! Teşekkür ederim!
pallevillesen

Komut dosyasına bir parametre iletmenin bir yolu var mı? aşağıdakiler çalışmaz: exec (open "setup.py install"). read (), globals ())
ben

1
@ben işe yaramaz çünkü openkodu doğrudan koddan okur. Argümanları iletmek için bu cevaba bakın , ancak yukarıda gösterildiği gibi execfileaçıkça kullanın execve kullanın open.
Nico

47

Henüz görmedim şaşırttı. Bir dosyayı yürütebilir ve yürütme sona erdikten sonra aşağıdaki -iseçeneği kullanarak yorumlayıcıyı açık bırakabilirsiniz :

| foo.py |
----------
testvar = 10

def bar(bing):
  return bing*3

--------



$ python -i foo.py
>>> testvar 
10
>>> bar(6)
18

30

Ayrı bir işlemi çağırmak için değil, bu dosyadan değişkenleri ve ayarları kullanmaya çalışıyorum.

Eh, sadece import filename(eksi .py, aynı dizinde veya sizin üzerinde olması gerekir PYTHONPATH) ile dosyayı içe aktarmak dosyayı değişkenler, fonksiyonlar, sınıflar, vb filename.variablead alanında kullanılabilir hale getirir .

Dolayısıyla cheddar.py, değişken spam ve yumurta işlevine sahipseniz, bunları içe aktarabilir import cheddar, değişkene erişebilir cheddar.spamve işlevi çağırarak çalıştırabilirsiniz.cheddar.eggs()

cheddar.pyBir işlevin dışında kodunuz varsa , hemen çalıştırılır, ancak içe aktarma sırasında bir şeyler çalıştıran uygulamalar oluşturmak kodunuzu yeniden kullanmayı zorlaştıracaktır. Mümkünse, her şeyi işlevlerin veya sınıfların içine koyun.


4
Bu, sorunun gerektirdiği gibi genel ad alanını kullanmayacaktır. Bunun yerine kullanınfrom filename import *
Ricardo Cruz

Soru, küresel bir ad alanı kullanarak özel olarak bahsetmiyor, OP'nin istediği şey olabilir, ancak sorudan açık değildir.
ryanpcmcquen

13

Benim görüşüme göre, en iyi yol:

import yourfile

ve file.py dosyasını değiştirdikten sonra

reload(yourfile)   

veya

import imp; 
imp.reload(yourfile) in python3

ancak bu işlevi ve sınıfları şöyle gösterecektir: yourfile.function1, yourfile.class1 .....

Bunları kabul edemezseniz, nihayetinde çözüm:

reload(yourfile)
from yourfile import *

9

Ben bir uzman değilim ama fark ettim:

örneğin kodunuz mycode.py ise ve yalnızca 'kodumu içe aktar' yazarsanız, Python kodu çalıştırır ancak tüm değişkenlerinizi yorumlayıcı tarafından kullanılabilir hale getirmez. Tüm değişkenleri tercüman tarafından kullanılabilir yapmak istiyorsanız, aslında 'mycode import *' yazmanız gerektiğini buldum.


3
Artı, bu bir yorum olmalı, bir cevap değil.
Adam Matan

9

Sadece yap,

from my_file import *

.Py uzantısı eklemediğinizden emin olun. Alt dizindeki .py dosyanız kullanılıyorsa,

from my_dir.my_file import *

Benim için en zarif görünüyor.
Massimiliano Kraus

8

İle ya python3 kullanım için xxxx = namebir yourfile.

exec(open('./xxxx.py').read())

8

Python 3 için:

>>> exec(open("helloworld.py").read())

Komutu çalıştırmadan önce doğru dizinde olduğunuzdan emin olun.

Farklı bir dizindeki bir dosyayı çalıştırmak için aşağıdaki komutu kullanabilirsiniz:

with open ("C:\\Users\\UserName\\SomeFolder\\helloworld.py", "r") as file:
    exec(file.read())

1

Aşağıdaki özellikleri istediğinizi varsayalım:

  1. Kaynak dosya hata ayıklayıcıda düzgün çalışıyor (dosya adı yığında gösterilir, vb.)
  2. __name__ == '__main__' Doğru olduğundan, komut dosyaları komut dosyaları gibi düzgün davranır.

exec(open('foo.py').read())Özelliği 1 başarısız import foostrateji özelliği 2 başarısız

Her ikisini de elde etmek için buna ihtiyacınız var:

    source = open(filename).read()
    code = compile(source, filename, 'exec')
    exec(code)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.