파이썬 인터프리터 내에서 파일을 실행하는 방법은 무엇입니까?


289

인터프리터 내에서 파이썬 명령으로 파일을 실행하려고합니다.

편집 : 별도의 프로세스를 호출하지 않고 해당 파일의 변수와 설정을 사용하려고합니다.


2
os 모듈, 다른 답변을 확인하고 있습니다.
Adam Matan 2016 년

2
제안 된 os.system; 편집을 읽을 때 답변을 삭제했습니다 :-/
lightsong

답변:


229

몇 가지 방법들.

껍질에서

python someFile.py

IDLE 내부에서 F5를 누르 십시오 .

대화식으로 입력하는 경우 다음을 시도하십시오. ( Python 2 전용 !)

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

Python3의 경우 다음을 사용하십시오.

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

10
pythonpython 3을 실행 중이면 작동하지 않고 python3대신 사용됩니다.
pzkpfw 2014 년

41
python3에 Execfile이 더 이상 존재하지 않으며 exec ()가 어떻게 든 작동하지 않는 것 같습니다 ... 내가 뭘 잘못하고 있는지 확실하지 않습니다. 답변을 업데이트 할 수 있습니까?
temporary_user_name 22

에서 실행 스크립트에 stdin사용 <하는 것과 같은 파일 을 제공하는 방법이 execfile()있습니까? @ s-lott
bhanu

9
@pzkpfw python은 모든 버전의 python을 가리킬 수 있습니다. 나는있는 환경 본 단지 파이썬 V3 python점을 python3.
StockB

2
@pzkpfw 이것은 python환경 변수에서 폴더를 찾을 때 시스템이 찾는 실행 파일 에 따라 다릅니다 PATH.
HelloGoodbye

254

파이썬 2의 경우 :

>>> execfile('filename.py')

파이썬 3의 경우 :

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

설명서를 참조하십시오 . Python 3.0을 사용하는 경우이 질문을 참조하십시오 .

filename.py에서 전역에 액세스 한 후 실행하는 방법에 대한 예는 @ S.Lott의 답변을 참조하십시오.


읽기 방법은 무엇을합니까? 불행히도 공식 문서 사이트는 명확한 예와 설명을 제공하지 않습니다.
Dmitry

파일을 읽고 기본적으로 전체 내용을 하나의 단일 문자열로 리턴합니다 (예 : 파일 열기의 w3schools 페이지 참조) .
Max

open ()에 대한 문서는 다음과 같습니다. docs.python.org/3/library/io.html
codeape

96

파이썬 2 + 파이썬 3

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

그러면 스크립트가 실행되고 모든 전역 변수가 인터프리터의 전역 범위 (대부분의 스크립팅 환경에서 일반적인 동작)에 배치됩니다.

파이썬 3 exec문서


1
너는 나의 영웅이야! os.getcwd ()가 한 가지를 말했지만 glob ( "*")가 다른 디렉토리에서 작동했던 며칠 동안 정말 이상한 것들과 싸우고 있습니다. 감사합니다! 감사합니다!
pallevillesen

스크립트에 매개 변수를 전달하는 방법이 있습니까? 다음은 작동하지 않습니다. exec (open "setup.py install"). read (), globals ())
ben

1
@ben open은 스크립트에서 코드를 직접 읽으 므로 작동하지 않습니다 . 인수를 전달하려면 이 답변을 보지 말고 위의 그림 과 같이 execfile분명히 사용하십시오 . execopen
니코

47

아직 이걸 보지 못해서 놀랐습니다. 다음 -i옵션을 사용하여 파일을 실행 한 다음 실행이 종료 된 후 인터프리터를 열어 둘 수 있습니다 .

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

def bar(bing):
  return bing*3

--------



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

30

별도의 프로세스를 호출하지 않고 해당 파일의 변수와 설정을 사용하려고합니다.

음, import filename(-py를 빼고 같은 디렉토리에 있거나 파일에 있어야 함) 파일을 가져 오면 파일을 PYTHONPATH실행하여 변수, 함수, 클래스 등을 filename.variable네임 스페이스 에서 사용할 수 있습니다 .

따라서 cheddar.py스팸 변수와 함수 에그가있는 경우 –로 가져 와서 import cheddar변수를 액세스 cheddar.spam하고 다음을 호출하여 함수를 실행할 수 있습니다.cheddar.eggs()

cheddar.py함수 외부에 코드가 있으면 즉시 실행되지만 가져올 때 실행되는 응용 프로그램을 빌드하면 코드를 재사용하기가 어려워집니다. 가능하다면 모든 것을 함수 나 클래스 안에 넣으십시오.


4
질문에 필요한 것처럼 전역 네임 스페이스를 사용하지 않습니다. 대신 사용from filename import *
Ricardo Cruz

이 질문에는 OP가 원하는 것이 될 수있는 전역 네임 스페이스 사용에 대한 언급이 없지만 질문에서 명확하지 않습니다.
ryanpcmcquen

13

내 관점에서 가장 좋은 방법은 다음과 같습니다.

import yourfile

및 yourfile.py를 수정 한 후

reload(yourfile)   

또는

import imp; 
imp.reload(yourfile) in python3

그러나 이것은 함수와 클래스를 다음과 같이 만들 것입니다 : yourfile.function1, yourfile.class1 .....

당신이 그것들을 받아 들일 수 없다면, 마지막 해결책은 다음과 같습니다.

reload(yourfile)
from yourfile import *

9

나는 전문가가 아니지만 이것이 내가 주목 한 것입니다.

예를 들어 코드가 mycode.py이고 'import mycode'만 입력하면 Python에서 코드를 실행하지만 모든 변수를 인터프리터에서 사용할 수는 없습니다. 인터프리터가 모든 변수를 사용할 수있게하려면 실제로 'from mycode import *'를 입력해야한다는 것을 알았습니다.


3
또한 답이 아닌 설명이어야합니다.
Adam Matan

9

그냥 해,

from my_file import *

.py 확장자를 추가하지 마십시오. 하위 디렉토리의 .py 파일을 사용하는 경우

from my_dir.my_file import *

나에게 가장 우아해 보인다.
Massimiliano Kraus

8

와 하나 python3 사용을 위해 xxxx = nameyourfile.

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

8

파이썬 3의 경우 :

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

명령을 실행하기 전에 올바른 디렉토리에 있는지 확인하십시오.

다른 디렉토리에서 파일을 실행하려면 아래 명령을 사용하십시오.

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

1

다음 기능을 원한다고 가정하십시오.

  1. 소스 파일이 디버거에서 올바르게 작동합니다 (파일 이름이 스택에 표시됨 등).
  2. __name__ == '__main__' 스크립트가 스크립트처럼 올바르게 작동하도록 True입니다.

exec(open('foo.py').read())이 기능 하나를 실패 import foo전략은 기능이 실패

둘 다 얻으려면 다음이 필요합니다.

    source = open(filename).read()
    code = compile(source, filename, 'exec')
    exec(code)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.