2016-08-29 3 views
1

저는 파이썬과 Cython의 조합으로 작성된 응용 프로그램을 가지고 있습니다. 나는 최근에이 응용 프로그램에 새로운 기능과 테스트를 추가했습니다. 테스트는 내 로컬 컴퓨터 (macbook)에서 수행되지만, appveyor (Windows CI 서비스)로 푸시하면 테스트가 실패합니다. 이것은 그 자체로 그렇게 이상하지 않습니다. appveyor에서 실행될 때 무슨 일이 일어나고 있는지보기 위해 Cython 코드에 print 문을 추가하면 더 이상 테스트가 실패하지 않습니다. 이것은 시험이 납품업자에 실패 할 때 일어나고있는 무슨을 알아낼 방법을 저에게 남겨주기 때문에 실망 스럽다. 파이썬과 Cython이 일반적으로 어떻게 작동하는지에 대한 나의 이해를 침해하기 때문에 또한 당황 스럽다.인쇄 문을 cython 코드에 추가하면 출력에 영향을줍니다.

코드가 복잡하고이 현상의 예를 공유 할 수있는 합리적인 방법이 없습니다. 그러나, 나는 이것이 일어날 수있는 이유를 찾고 있습니다. Cython 코드에서 print 문이 다른 계산에 어떤 영향을 줄 수 있습니까?

답변

2

내 경험에 비추어 볼 때 일반적인 경우는 할당되지 않은 또는 정렬되지 않은 저장소에서 값을 가져올 수있는 곳입니다. 즉, 컴파일러가 이러한 남용을 감지 할 수있는 메모리 사용 오류입니다. 일반적으로 쓰레기 값을 얻습니다. print 문은 문제를 "수정"하는 평가 또는 메모리 정렬을 강제 실행합니다.

비트 값을 변경하지 않고 형식을 변경하면 특히 값을 "하드 캐스팅"하지 않는 한 대부분의 현대 언어에서는 실수로 수행하기가 어렵습니다.

+0

문제는 0으로 초기화해야하는 초기화되지 않은 정수로 판명되었습니다. 어쨌든 0에서 시작된 맥북에서,하지만 나는 Windows에서 임의의 값이 메모리 위치에 있다고 생각합니다. 여전히 이해할 수없는 점은 다른 변수의 특정 조합을 인쇄하여 문제를 해결하는 것일 수 있다는 것입니다. 그러나, 나는 당신이 묘사하고있는 것과 가깝다고 생각합니다. – jcrudy

+0

아하! 귀하의 코드가 초기화되지 않은 변수를 허용했음을 실망합니다. 나는 런타임 오류를 얻는 첫 번째 레퍼런스에 익숙하다. 예, 추가 된 ** 인쇄물 **이 우발적 인 일로 0 비트가 필요합니다. – Prune

+0

일반 파이썬에서는 초기화되지 않은 변수의 값을 사용하려고하면 런타임 오류가 발생합니다. Cython에서는 초기화하지 않고 C와 같은 변수를 선언 할 수 있습니다. 그래서 int 카운터를 선언했지만 초기 값을 0으로 설정하는 것을 잊었습니다. – jcrudy

1

시간을 절약하기 위해 Appveyor 빌드의 여러 단계에 삽입 할 수있는 차단 RDP (https://www.appveyor.com/docs/how-to/rdp-to-build-worker/)를 사용하여 디버깅을 시도 할 수 있습니다. RDP 세션의 환경 변수는 에이전트 작성 프로세스와 동일하지 않으므로 repo를 얻으려면 RDP 환경을 조정해야 할 수도 있습니다.

--ilya.

관련 문제