ERROR: Exception:
Traceback (most recent call last):
  File "c:\users\fezsi\scoop\apps\python27\current\lib\site-packages\pip\_internal\cli\base_command.py", line 188, in main
    status = self.run(options, args)
  File "c:\users\fezsi\scoop\apps\python27\current\lib\site-packages\pip\_internal\commands\install.py", line 345, in run
    resolver.resolve(requirement_set)
  File "c:\users\fezsi\scoop\apps\python27\current\lib\site-packages\pip\_internal\legacy_resolve.py", line 196, in resolve
    self._resolve_one(requirement_set, req)
  File "c:\users\fezsi\scoop\apps\python27\current\lib\site-packages\pip\_internal\legacy_resolve.py", line 359, in _resolve_one
    abstract_dist = self._get_abstract_dist_for(req_to_install)
  File "c:\users\fezsi\scoop\apps\python27\current\lib\site-packages\pip\_internal\legacy_resolve.py", line 307, in _get_abstract_dist_for
    self.require_hashes
  File "c:\users\fezsi\scoop\apps\python27\current\lib\site-packages\pip\_internal\operations\prepare.py", line 134, in prepare_linked_requirement
    req.populate_link(finder, upgrade_allowed, require_hashes)
  File "c:\users\fezsi\scoop\apps\python27\current\lib\site-packages\pip\_internal\req\req_install.py", line 211, in populate_link
    self.link = finder.find_requirement(self, upgrade)
  File "c:\users\fezsi\scoop\apps\python27\current\lib\site-packages\pip\_internal\index.py", line 1201, in find_requirement
    req.name, specifier=req.specifier, hashes=hashes,
  File "c:\users\fezsi\scoop\apps\python27\current\lib\site-packages\pip\_internal\index.py", line 1183, in find_candidates
    candidates = self.find_all_candidates(project_name)
  File "c:\users\fezsi\scoop\apps\python27\current\lib\site-packages\pip\_internal\index.py", line 1128, in find_all_candidates
    for page in self._get_pages(url_locations, project_name):
  File "c:\users\fezsi\scoop\apps\python27\current\lib\site-packages\pip\_internal\index.py", line 1282, in _get_pages
    page = _get_html_page(location, session=self.session)
  File "c:\users\fezsi\scoop\apps\python27\current\lib\site-packages\pip\_internal\index.py", line 234, in _get_html_page
    resp = _get_html_response(url, session=session)
  File "c:\users\fezsi\scoop\apps\python27\current\lib\site-packages\pip\_internal\index.py", line 182, in _get_html_response
    "Cache-Control": "max-age=0",
  File "c:\users\fezsi\scoop\apps\python27\current\lib\site-packages\pip\_vendor\requests\sessions.py", line 546, in get
    return self.request('GET', url, **kwargs)
  File "c:\users\fezsi\scoop\apps\python27\current\lib\site-packages\pip\_internal\download.py", line 624, in request
    return super(PipSession, self).request(method, url, *args, **kwargs)
  File "c:\users\fezsi\scoop\apps\python27\current\lib\site-packages\pip\_vendor\requests\sessions.py", line 524, in request
    prep.url, proxies, stream, verify, cert
  File "c:\users\fezsi\scoop\apps\python27\current\lib\site-packages\pip\_vendor\requests\sessions.py", line 700, in merge_environment_settings
    env_proxies = get_environ_proxies(url, no_proxy=no_proxy)
  File "c:\users\fezsi\scoop\apps\python27\current\lib\site-packages\pip\_vendor\requests\utils.py", line 761, in get_environ_proxies
    if should_bypass_proxies(url, no_proxy=no_proxy):
  File "c:\users\fezsi\scoop\apps\python27\current\lib\site-packages\pip\_vendor\requests\utils.py", line 745, in should_bypass_proxies
    bypass = proxy_bypass(parsed.hostname)
  File "c:\users\fezsi\scoop\apps\python27\current\lib\site-packages\pip\_vendor\requests\utils.py", line 95, in proxy_bypass
    return proxy_bypass_registry(host)
  File "c:\users\fezsi\scoop\apps\python27\current\lib\site-packages\pip\_vendor\requests\utils.py", line 61, in proxy_bypass_registry
    'ProxyEnable')[0])
ValueError: invalid literal for int() with base 10: ''

일단 내가 받은 에러 메시지는 이렇다 

 

프록시 쪽을 건든 기억이 있긴 한데 워낙 오래전 일이라 잘 기억 나지 않는다

그래서 ssl 관련 에러인 줄 알았다

 

단순하게 해결하는 방법은 그냥 pip 코드에서 프록시 설정 체크를 안 하도록 하면 된다.

다음과 같은 디렉토리/패스로 이동하자

 

> cd ...python-path/lib/site-packages/pip/_vendor/requests

 

이제 adapters.py를 열고 proxy = select_proxy를 검색한다. get_connection 함수에 있다.

 

해당 라인을 proxy = False로 변경한다.

 

이제 pip 사용하면 정상 작동 한다.

 

끝 

일반적으로 사용자 액션 없이 데이터 수정을 해도 뷰에 바로 반영이 안 되기 때문에 다음과 같이 해야 한다.

 

class DataModel : ObservableObject {
    @Published public var state: Int
    
    init(_ data: Int) {
		self.state = data
    }
}

struct ContentView: View {
    @ObservedObject var data: DataModel
    
    var body: some View {
    	HStack {
        	Text("\(self.data.state)")
        }
    }
}

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    var window: UIWindow?

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    	let dataModel = DataModel(0)
        let contentView = ContentView(data: dataModel)
        
        DispatchQueue.global().async {
            while true {
                DispatchQueue.main.async { // 업데이트는 꼭 메인 스레드에서 해야 합니다.
                    contentView.data.objectWillChange.send() // 먼저 실행
                }
                _ = PseudoUpdater.refresh(dataModel) // pseudo: 업데이트 코드 실행 
                usleep(500_000)
            }
        }

        if let windowScene = scene as? UIWindowScene {
            let window = UIWindow(windowScene: windowScene)
            window.rootViewController = UIHostingController(rootView: contentView)
            self.window = window
            window.makeKeyAndVisible()
        }
        
        // ...
    }

이렇게 하면 다음과 같은 결과를 얻는다

 

  1. 씬을 초기화 할 때 DataModel의 state 프로퍼티를 0으로 초기화해 생성한다.
  2. 컨텐트 뷰를 미리 생성한 DataModel과 함께 생성한다.
  3. DispatchQueue를 이용해 글로벌 스레드에서 비동기 작업으로 다음과 같은 작업을 무한 반복한다.
    1. 메인 스레드에서 contentView의 data에 데이터가 바뀐다는 신호를 보낸다.
    2. 의사코드: dataModel에 대한 업데이트 작업을 진행한다.
    3. 0.5초 대기한다.
  4. 기본 씬 생성 코드...

이렇게 하면 외부 코드(여기서는 PseudoUpdater의 refresh 메서드)에 따라서 dataModel 내의 데이터가 변경될 것이고 이에 우리는 변경될 것이라는 것을 SwiftUI에 알려줬으니 수치가 변경 되면 알아서 반영해줄 것이다.

 

 

 

p.s. 별 거 아닌데 내 조잡한 영어 실력으로 구글링 하면 죄다 BindableObject 같은 말도 안 되는 Deprecated 된 예시만 들어서 몇 시간 꼴았다. 갈 곳 잃은 분노를 식히고 하루 지나서야 포스트 작성.