2017-09-30 2 views
1

Im 간단한 Python 앱을 만들고 있습니다. 내가 제대로 여부를 그 일을하고 있다면 정말 코멘트에 저를 수정하거나하시기 바랍니다 잘 모릅니다이Python setup.py 테스트를하는 동안 ImportError가 발생했습니다.

오류에 대한 답이있는 경우 : ImportError: No module named 'taskhandler'ImportError: No module named 'styles' while doing을 python3 setup.py test`

파일 구조 :

. 
├── MANIFEST.in 
├── pydotask.egg-info 
│   ├── dependency_links.txt 
│   ├── not-zip-safe 
│   ├── PKG-INFO 
│   ├── SOURCES.txt 
│   └── top_level.txt 
├── README.md 
├── setup.py 
├── task_mod 
│   ├── __init__.py 
│   ├── __pycache__ 
│   │   ├── __init__.cpython-35.pyc 
│   │   ├── pydo.cpython-35.pyc 
│   │   └── taskhandler.cpython-35.pyc 
│   ├── pydo.py 
│   ├── styles 
│   │   ├── __init__.py 
│   │   ├── __pycache__ 
│   │   │   ├── __init__.cpython-35.pyc 
│   │   │   ├── termcolor.cpython-35.pyc 
│   │   │   └── text_style.cpython-35.pyc 
│   │   ├── termcolor.py 
│   │   └── text_style.py 
│   ├── taskhandler.py 
│   └── tasks.csv 
└── update.txt 

5 directories, 22 files 

'task_mod/pydo.py'

#!/usr/bin/env python3 

''' To Do App in Python ''' 

import sys, os 
import taskhandler as task 
from styles import text_style as text 
from styles import termcolor 

task_mod/taskhandler.py :

그래서이 문제를 해결 얻는 방법
#!/usr/bin/env python3 

import sys, os 
import csv 
from styles import termcolor 
from styles import text_style as text 

setup.py

from setuptools import setup 

def readme(): 
    with open('README.md') as readme: 
     return readme.read() 

setup(
     name = 'pydotask', 
     version = '0.2', 
     description = 'PyDo is a CLI Application to keep you on track with your tasks and projects', 
     long_description = readme(), 
     classifiers = [ 
      'Development Status :: 3 - Alpha', 
      'Programming Language :: Python :: 3.5', 
      'Topic :: Office/Business :: Scheduling' 
      ], 
     keywords = 'utilities office schedule task reminder', 
     url = '', 
     author = 'Abhishta Gatya', 
     author_email = '[email protected]', 
     packages = ['task_mod'], 
     scripts = ['task_mod/pydo'], 
     python_requires = '>=3', 
     include_package_data = True, 
     zip_safe = False 
     ) 

?

참고 : python3 task_mod/pydo.py을 실행하면 문제가 없습니다. 하지만 그것을 테스트하려고하면 2 가져 오기 오류가 발생합니다

+0

'pydo.py'와'taskhandler.py'의 시작 부분에'#!/usr/bin/env python3' 줄이 있기 때문에 아닌가요? – Iva

+0

@Iva 그건 통역사 경로 – Steampunkery

+0

일 뿐이므로 그 원인이 무엇입니까? 잠깐만 기다려주세요 –

답변

1

먼저 setup.pytask_mod라는 이름의 패키지를 제공 있습니다. 즉, import task_mod 또는 import task_mod.blah이어야하며 결코 import blah이 아니어야합니다. 라이브러리에 blah을 제공하지 않았기 때문입니다. 가져 오기를 절대적인 것으로 변경하려고합니다.

둘째, 상대적 가져 오기가 필요한 경우 (일반적으로 단일 라이브러리로 수행하는 것이 일반적이므로 코드를 유지 관리하는 것이 더 쉽습니다.) 상대적으로 from .styles import termcolor (점 참고)을 가져와야합니다.

셋째, 상대적으로 수입에만 모듈을 & 패키지가 아닌 당신이 direcly 실행 스크립트에 영향 (pydo.py 패키지 __main__하지 task_mod.pydo 때문에, 그리고이 모든 것을 변화). 스크립트의 경우 올바르게 수행 할 두 가지 선택이 있습니다.

선택 사항 (절대) : 절대 패키지/모듈 이름 (import task_mod.taskhandler as tashhandler, 반드시 from task_mod.styles import termcolor 등)을 항상 가져옵니다.

선택 사항 B (권장 사항) : 라이브러리의 일부로 스크립트를 내 보내지 마십시오 (빌드/테스트/CI/CD 전용). 대신 콘솔 스크립트 (google : setuptools 진입 점)에 대한 진입 점을 내 보냅니다.

setup( .... entry_points={ 'console_scripts': [ 'pydo = task_mod.pydo:main', ], }, )

있고, 물론,이 모듈의 함수를 정의 main().

새틴 (#!...python3)은 여기에서 전혀 관련이 없습니다.


UPD : 당신이 가져 오는 문제가있는 경우

,이 점을 염두에 두시기 바랍니다 :

당신은 PYTHONPATH의 ENV var에에있을 패키지를해야

(또는 sys.path 내부 변수) , 한 방법 또는 다른. 이것은 정확히 파이썬이 당신이 import things 일을 할 때 찾을 것입니다. 첫 번째 요소는 스크립트의 디렉토리 것, 그것은 setup.py & task_mod/pydo.py 사이의 통화를 변화한다 -

가 이런 식으로 일이 왜 당신은 어떤 수입 전에 print(sys.path)는 볼 수 있습니다.

주 프로젝트 디렉터리 (python3 setup.py)에서 스크립트를 실행하면 sys.path은 프로젝트의 디렉터리로 시작합니다. task_mod이 있습니다. 가져올 수 있습니다. 또한 pip install -e .과 같은 작업을 수행하면 패키지가 Python/virtualenv 라이브러리 목록에 "설치"되지만 다른 방법으로 "설치"됩니다.

그러나 python3 task_mod/pydo.py을 실행하면 현재 디렉토리가 .../task_mod/이됩니다. 거기에서 task_mod 패키지를 찾을 수 없습니다 (하나의 상단에 있기 때문에). 러닝 python3 setup.py는, 현재의 디렉토리가 프로젝트의 디렉토리이며, 당신이 innitially 그랬던 것처럼 당신이 (task_mod.하여 그들을 접두사없이) 직접 styles & taskhandler를 가져올 수 없습니다 반대편에

.

sys.path에 의존해서는 안되며 스크립트를 직접 사용하지 말고 그 위치를 추측해야합니다. 그것은 다양하기 때문입니다.

PYTHONPATH=. python3 task_mod/pydo.py을 실행하여 setup.py (또는 PYTHONPATH=./task_mod/ python3 setup.py)과 동일하게 작동 시켜서 task_mod/pydo.py과 동일하게 만들 수 있습니다. 그러나 이것은 이것이 작동하도록하는 더러운 해킹입니다. 대신 Python의 규칙에 따라 라이브러리를 적절하게 레이아웃해야합니다.

+0

Dashbang? 너 shebang을 의미합니까? – Steampunkery

+0

죄송합니다. 네, 그 녀석들. 미안 해요 :-). –

+0

이제 pydo.py를 실행하려고 할 때 'task_mod'라는 모듈이 없다는 ImportError가 발생합니다 –

2

최상위 폴더뿐만 아니라 setup.py에서 사용되는 모든 모듈을 지정해야합니다. 그래서 setup.py 파일에서 packages = ['task_mod'],packages = ['task_mod', 'task_mod.styles', 'task_mod.taskhandler'],으로 바꿉니다.

setup.py을 변경하지 않고 import task_mod.styles 또는 from task_mod import styles으로 가져올 수 있습니다. 그런 다음 styles.termcolor과 같은 스타일의 파일을 사용할 수 있습니다.

또는 당신과 같이 setuptool의 마술 기능 find_packages을 사용할 수 있습니다 : packages = find_packages(),

Related SO post

+0

고마워요! –

+1

도움이 될 수있어서 기쁩니다! – Steampunkery

관련 문제