1

현재 Python2와 호환되는 Python2 용 모듈을 작성하려고합니다. setuptools : 원래 디렉토리 대신 build dir에 대한 테스트 실행

나는 모든 코드가 자동으로 setup.py으로 2to3로 변환하고 추가 할 수 있음을 확인하여 시작 :
use_2to3 = True, 

지금까지, 모든 것이 잘 작동한다.

변환 된 파일을 테스트하고 싶습니다.
테스트는 2to3없이 실행될 수 있도록 작성되었습니다. 내 폴더 구조는 다음과 같습니다 내 setup.py으로

# ls /path/to/mymodule 
setup.py 
mymodule/ 
tests/ 
build/ 

, 나는

test_suite = "tests", 

추가는 지금은 자동으로 코드를 변환 내 테스트하기 위해
rm -rf build/ 
python3 setup.py build 
python3 setup.py test 

을 실행합니다. 테스트가 여전히 mymodule 디렉토리에 실행되기 때문에 은 그러나 실패 : 내 build/에서

File "/path/to/mymodule/mymodule/main.py", line 35 
    logger.info(u'Scanning {path}'.format(path=self.path)) 
            ^
SyntaxError: invalid syntax 
[This Syntax error is in MODULE code, not in TEST code.] 
[I expect the path to be: /path/to/mymodule/build/lib/mymodule/main.py] 

가 제대로있는 파일을 변환. distribute가 올바르게 변환하는 경우 변환 된 파일에 대해 테스트가 실행되지 않는 이유는 무엇입니까?

나는 뭔가를 놓친가요? 누락 된 매개 변수에 대한 setuptools/distribute의 설명서를 이미 확인했습니다. 불필요한 공간을 차지하는 테스트 용 리소스 파일이 여러 개 있기 때문에 테스트를 모듈에 포함하고 싶지 않습니다.

=> python3에서 실행할 때 다른 폴더에 대한 테스트를 실행하도록 setup.py를 구성 할 수 있습니까?

답변

1

우선 logger.info(u'Scanning {path}'.format(path=self.path))은 Python 3.2에서 유효하지 않습니다. u''의 구문은 u이 Python 3.0에서 제거되어 3.2가 아닌 Python 3.3에 다시 도입되어 유효하지 않습니다.

이것은 유니 코드 문자열 리터럴없이 Python 3.2에서 작동하도록 테스트를 변환해야 함을 의미합니다. 한 가지 대안은 바이트 리터럴을 사용하고 그것들을 디코드하는 것입니다 (b''.decode('UTF-8')). 3.x +에서 유니 코드이므로 이미 문자열을 사용할 수 있습니다.

둘째, 복수 Python 버전에서 코드베이스를 테스트하는 데 tox을 사용하는 것이 좋습니다. 제공된 setup.py 파일을 사용하고 여러 가상 환경을 만들고 각 Python 버전의 코드베이스를 개별적으로 테스트합니다. 즉, 2.x 및 3.x에서 테스트를 실행하고 모든 것이 여전히 작동하는지 확인할 수 있음을 의미합니다.

어쨌든 2to3은 권장되지 않습니다. Python 2.x 프로젝트는 2.x 및 3.x와 호환되도록 코드베이스를 조정하여 포팅해야합니다.

+0

안녕하세요, "하지만 테스트가 여전히 mymodule 디렉토리에서 실행되기 때문에 실패합니다." 이것은 테스트 코드가 아니라 모듈 코드입니다. 2to3 변환 코드는 괜찮지 만 테스트는이 코드로 실행되지 않습니다. – Nippey

+0

어쨌든, 독극물에 대해 살펴 보겠습니다. 첫 번째 접근 방식은 원래 저자를 존중하기 위해 가능한 한 최소한으로 통합 된 변경 사항을 적용하는 것이 었습니다.) – Nippey

+0

@Nippey : '2to3'은 권장 접근 방식이 아닙니다. Python 2.x 프로젝트는 다음을 적용하여 포팅해야합니다. 2.x 및 3.x와 호환되는 코드베이스. –