2017-12-01 24 views
3

나는 다음과 같은 디렉토리 구조 "새총"라는 파이썬 프로젝트/라이브러리를 가지고있다.파이썬 3.6에서 절대 및 상대 임포트를 어떻게 사용합니까? <code>__main__.py</code>에서</p> <pre><code>slingshot/ __init__.py __main__.py build.py deploy.py util/ __init__.py prepare_env.py cdn_api.py </code></pre> <p>내가 <code>util/prepare_env.py</code>에서 기능을 가져올 것 :

내가 util 내 프로젝트에서 내가 가지고있는 util을 의미 수 있도록, 그리고 것없는 곳에 설치 될 수있는 몇 가지 다른 util 라이브러리입니다.

나는 from .util import prepare_env을 시도했지만 오류가 발생합니다.

from util import prepare_env "util"의 모호성을 해결하지 못하는 것 같습니다.

내가 뭘 잘못하고 있니? 다음과 같이


__main__.py은 다음과 같습니다

import os 
from .util import prepare_env 

if __name__ == '__main__': 
    if 'SLINGSHOT_INITIALIZED' not in os.environ: 
     prepare_env.pip_install_requirements() 
     prepare_env.stub_travis() 
     prepare_env.align_branches() 
     os.environ['SLINGSHOT_INITIALIZED'] = 'true' 

을 내가 python3 ./slingshot를 입력하면 다음과 같은 에러가 발생

/usr/local/opt/python3/bin/python3.6: Relative module names not supported 
: 나는 python3 -m ./slingshot 나는 다음과 같은 오류가 입력 할 때

File "./slingshot/__main__.py", line 2, in <module> 
    from .util import prepare_env 
ImportError: attempted relative import with no known parent package 

+1

당신이 얻을 오류를 공유하세요, 당신이 당신의'__main __ py' 스크립트를 시작하는 방법.. –

+1

'python3 -m slingshot' ('. /'접두사 없음)을 실행해야합니다. –

답변

4

__main__.py 패키지의 모듈은 -m 명령 줄 스위치를 사용할 때 모듈을 스크립트로 실행합니다. 그 스위치는 모듈 이름 소요가 아닌 경로, 그래서 ./ 접두사 드롭 :

python3 -m slingshot 

현재 작업 디렉토리가 너무 slingshot 먼저 발견되는 모듈 검색 경로의 시작에 추가를 필요는 포기하지합니다 상대 경로 지정은 여기에 있습니다.

-m switch documentation에서

:

Search sys.path for the named module and execute its contents as the __main__ module.

Since the argument is a module name, you must not give a file extension (.py). The module name should be a valid absolute Python module name[.]

[...]

As with the -c option, the current directory will be added to the start of sys.path .