반응형

출처 : https://stackoverflow.com/Questions/4374455/how-to-set-sys-stdout-encoding-in-python-3

Python3에서 sys.stdout 인코딩 하는 방법

Python 2에서 기본 출력 인코딩으로 설정하는 것은 잘 알려진 구문입니다.

sys.stdout = codecs.getwriter("utf-8")(sys.stdout)    

이는 UTF-8로 출력을 인코딩하여 codec writer에서 sys.stdout를 포장(wrap)합니다.

하지만, 이 기술은 Python 3 에서는 작동하지 않습니다. 그 이유는 sys.stdout.write()str를 예상하는데 인코딩의 결과는 bytes이고 codecs가 원래 sys.stdout로 인코딩된 바이트배열을 출력하려고 할 때 오류가 발생합니다.

Python 3에서 이를 할 수 있는 올바른 방법은 무엇입니까?


7개의 답변 중 2개의 답변만 추려냄.

Python 3.7부터 당신은 reconfigure()로 표준 스트림의 인코딩을 변경할 수 있습니다.

sys.stdout.reconfigure(encoding='utf-8')

당신은 errors 파라미터를 추가하여 인코딩 오류가 다뤄질 수 있도록 수정할 수 있습니다.


Python 3.1에 io.TextIOBase.detach()가 추가되었습니다. 다음은 sys.stdout에 대한 문서 내용입니다.

표준 스트림은 기본으로 text 모드입니다. 이 스트림에 이진(binary) 데이터를 쓰거나 읽기 위해 기본 바이너리 버퍼를 사용합니다. 예를 들어 stdout에 바이트 배열을 쓰기 위해 sys.stdout.buffer.write(b'abc')를 사용합니다. io.TextIOBase.detach()를 사용함으로써, 스트림은 기본으로 바이너리가 될 수 있습니다. 이 함수는 바이너리로 stdinstdout을 설정합니다.

def make_streams_binary():
    sys.stdin = sys.stdin.detach()
    sys.stdout = sys.stdout.detach()

그리하여, Python 3.1 이상에서 대응되는 구문은 다음과 같습니다.

sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach())
반응형
반응형

출처

https://stackoverflow.com/questions/7749530/what-is-the-difference-between-and-in-scala/7749570

스칼라에서 \=:=의 차이점은 무엇입니까?

스칼라에서 \=:=의 차이점은 무엇입니까?

저는 "스칼라 :=(콜론 이퀄)"에 관해 광범위하게 구글링 해보았지만 결정적인 어떤 것도 찾지 못했습니다.


4개의 답변 중 1개의 답변

스칼라에서 =는 실제 대입 연산자입니다. 몇 가지 특정 작업을 수행하지만 다음과 같은 대부분의 경우 제어할(다시 정의할) 권한이 없습니다.

  • 생성할 때 val 또는 var 형태의 값을 제공

  • var 의 값을 변경

  • 클래스에서 필드의 값을 변경

  • type alias를 생성

  • 아마 다른 것들

:=는 내장된(build-in) 연산이 아닙니다. 누구든 원하는 대로 의미를 정의하고 오버로딩할 수 있습니다. :=를 사용하기 좋아하는 이유는 매우 대입 연산자처럼 보이고 다른 언어에서 대입 연산자로 사용하고 있기 때문입니다.

그래서 당신이 사용하고 있는 라이브러리에서 :=가 뜻하는 것을 찾아보는 시도가 필요합니다. := 이름의 메소드를 Scaladocs(만약 있다면)를 통해 살펴보시는 것을 권유합니다.

반응형
반응형

tf.placeholder와 tf.Variable의 차이점은 무엇입니까?

저는 텐서플로우 뉴비입니다. 저는 tf.placeholdertf.Variable의 차이점이 해깔립니다. 제 관점에서 tf.placeholder는 입력 데이터를 위해 사용되고 tf.Variable은 데이터의 상태를 저장하는 데 사용됩니다. 이것이 제가 알고 있는 것의 전부입니다.

이 둘의 차이점을 더 자세하게 설명해 주실 분이 있으신가요? 특별히 언제 tf.placeholder를 사용하고 또한 언제 tf.Variable을 사용하나요?


14개의 답변 중 1 개의 답변만 추려냄.

간단히, 당신의 모델에서 가중치(W, weights)와 편향(B, Bias) 처럼 학습 가능한 변수를 위해 tf.Variable를 사용합니다.

weights = tf.Variable(
    tf.truncated_normal([IMAGE_PIXELS, hidden1_units],
                    stddev=1.0 / math.sqrt(float(IMAGE_PIXELS))), name='weights')

biases = tf.Variable(tf.zeros([hidden1_units]), name='biases')

tf.placeholder는 실제 학습 예시를 공급(feed)하는 데 사용됩니다.

images_placeholder = tf.placeholder(tf.float32, shape=(batch_size, IMAGE_PIXELS))
labels_placeholder = tf.placeholder(tf.int32, shape=(batch_size))

다음은 학습되는 동안 학습 예시를 공급(feed)하는 방법입니다.

for step in xrange(FLAGS.max_steps):
    feed_dict = {
       images_placeholder: images_feed,
       labels_placeholder: labels_feed,
     }
    _, loss_value = sess.run([train_op, loss], feed_dict=feed_dict)

당신의 tf.variables는 이 학습의 결과로서 (수정되고) 학습될 것입니다.

더 자세한 내용은 https://www.tensorflow.org/versions/r0.7/tutorials/mnist/tf/index.html에서 확인하세요. (예시는 웹 페이지에서 가져왔습니다.)

반응형
반응형

출처

https://serverfault.com/questions/59140/how-do-diff-over-ssh


ssh로 원격 diff 하는 방법

ssh로 접속만이 가능한 원격 머신에 있는 파일이나 폴더를 diff를 어떻게 할 수 있을까요?

------

14개의 답변 중 1 개의 답변만 추려냄.

Bash의 process substitution으로 당신은 원격 diff를 하실 수 있습니다.

diff foo <(ssh myServer 'cat foo')

또는 둘다 원격 서버라면 다음처럼 가능합니다.

diff <(ssh myServer1 'cat foo') <(ssh myServer2 'cat foo')


반응형
반응형

출처

https://serverfault.com/questions/914476/cant-access-mariadb-from-google-cloud-compute-instance


구글 클라우드 / Compute 인스턴스로부터 MariaDB에 접근할 수 없습니다.

저는 구글 클라우드 / Compute 인스턴스에서 실행하고 있는 Mysql에 원격 접근을 할 수 없는 거 같습니다. 저는 기본 설치를 시도하였습니다.

1. 저는 인스턴스를 기본값인 Debian을 사용하여 만들었습니다.

2. mysql을 apt-get install로 설치했고 설명하기 어렵지만 대신 MariaDB를 설치했습니다. 잘됩니다.

3. 저는 sudo mysql mysql_secure_installation을 prompt에 따라서 를 실행하였습니다. 설명하기 어렵지만 sudo를 사용하여 local 접근만 허용하기 위해 "root"를 위한 mysql.users 행을 "unix_socket"의 플러그인 열 값으로 나두었습니다.  잘 되었고 새로운 사용자를 추가하려고 합니다.

4. 저는 local에서 로그인하고 다음을 실행하였습니다.

create user 'myname'@'%' identified by 'mypass';

grant all privileges on * . * to 'mypass'@'%';

flush privileges;


저는 localhost에서 'myname'을 사용하여 접속할 수 있었습니다.

5. 저는 구글 클라우드 방화벽에서 8088 포트와 똑같은 규칙으로 만들었고 그 포트가 원격에서 잘 접속을 할 수 있었기 때문에 0.0.0.0/0으로 3306 포트를 열었습니다. 

6. 저는 원격에서 mysql을 접속했을 때 다음과 같은 내용을 얻었습니다.

이는 네트워크 문제일 수도 mysql 문제일 수도 있을 거 같은데 어느쪽인지 저는 모르겠습니다. 좋은 아이디어 있으신가요?

------

1개의 답변 중 1 개의 답변만 추려냄(자문자답)

알아내었습니다. /etc/mysql/maria.conf.d/50-server.cnf 설정 파일 깊은 곳에 뭍여 있었습니다. 그 파일에 놀라운 부분이 있었습니다.

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address        = 127.0.0.1

bind-address 부분을 주석처리 하니 잘 작동하였습니다.

이것은 MySql을 요청할 때 Debian으로 MariaDB를 설치하는 것은 예외적으로 나쁜 결정의 결과입니다. mysql*과 mariadb*라는 이름으로 복잡한 설정 파일들이 있는데 아무도 그 파일들이 하고자 하는 일을 하지 않습니다.

반응형
반응형

출처 : https://stackoverflow.com/questions/21268470/making-python-2-7-code-run-with-python-2-6/

Python 2.7 코드를 Python 2.6에서도 작동하게 만들기

저는 zip 파일을 풀 수 있는 간단한 Python 함수를 만들었습니다. (플랫폼 독립적으로)

def unzip(source, target):
    with zipfile.ZipFile(source , "r") as z:
        z.extractall(target)
    print "Extracted : " + source +  " to: " + target

이는 Python 2.7에서는 잘 실행되지만 Python 2.6에서는 실패합니다.

AttributeError: ZipFile instance has no attribute '__exit__':

저는 2.6에서 2.7로 업그레이드 할 것을 제안한 글을 찾았습니다.

https://bugs.launchpad.net/horizon/+bug/955994

하지만 위의 코드를 Python 2.6에서 작동할 수 있도록 플랫폼에 관계없이 이식이 가능한가요??


2개의 답변 중 1 개의 답변만 추려냄.

다음 코드는 어떻습니까?

import contextlib

def unzip(source, target):
    with contextlib.closing(zipfile.ZipFile(source , "r")) as z:
        z.extractall(target)
    print "Extracted : " + source +  " to: " + target

contextlib.closingZipFile에서 빠져있는 __exit__메소드가 하려고 했던 것을 분명히 실행합니다. 이름처럼 close 메소드를 호출합니다.

반응형
반응형

출처

https://stackoverflow.com/questions/10856447/sed-command-find-and-replace-in-even-lines-of-a-file


sed에서 파일의 짝수 줄만 찾아 치환하는 명령

저는 이 stackoverflow에서 신입입니다. 저는 SED를 사용하여 파일의 짝수 줄만 표현식으로 치환하고 싶습니다. 제 문제는 원래 파일의 변화는 원래 파일에서 변한 내용을 저장하는 방법을 생각할 수 없다는 점입니다. (예: 파일에서 변한 내용을 덮어쓰는 방법) 저는 다음을 시도해 보았습니다.

sed -n 'n;p;' filename | sed 's/aaa/bbb/'

하지만 이는 변한 내용을 저장할 수 없습니다. 이에 대한 당신의 도움에 감사드립니다.

------

4개의 답변 중 1 개의 답변만 추려냄.

다음을 시도하세요.

sed -i '2~2 s/aaa/bbb/' filename

-i 옵션은 sed에게 해당 filename에서 작동하도록 표준출력(stdout)으로 수정된 버전을 쓰지 않고 즉 원래 파일을 나두지 않고 파일의 변경 내용을 적용하도록 합니다. 2~2부분은 명령어를 통해 적용되어야 할 sed의 줄(라인)에 대한 주소입니다. 2~2는 짝수 줄만 편집(수정)함을 의미합니다. 1~2는 홀수 줄만 편집(수정)함을 의미합니다. 5~6는 6줄마다 편집(수정)하고 5번째 줄부터 시작합니다.

-- 역자 추가 내용--

참고주소

https://www.gnu.org/software/sed/manual/html_node/Addresses.html


반응형
반응형

출처 : https://stackoverflow.com/questions/19447603/how-to-kill-a-python-child-process-created-with-subprocess-check-output-when-t

부모 프로세스가 죽을 때 subprocess.check_output()로 생성된 Python 자식 프로세스를 죽이는 방법?

저는 다음처럼 subprocess.check_output()을 사용하는 자식 프로세스를 생성하는 python script를 리눅스 머신에서 실행하려고 합니다.

subprocess.check_output(["ls", "-l"], stderr=subprocess.STDOUT)

문제는 부모 프로세스가 죽었을 때 조차 자식 프로세스가 실행중이라는 것입니다. 부모 프로세스가 죽었을 때 자식 프로세스도 함께 죽일 수 있는 방법이 있습니까?


5개의 답변 중 2개의 답변

당신의 문제는 subprocess.check_output을 사용하는 것입니다. - 당신은 맞게 작성 했습니다만 check_ouput 인터페이스로는 자식 프로세스의 PID를 얻을 수 없습니다. 대신에 Popen을 사용하세요.

proc = subprocess.Popen(["ls", "-l"], stdout=PIPE, stderr=PIPE)

# 여기에서 자식 프로세스의 PID를 얻을 수 있습니다.
global child_pid
child_pid = proc.pid

# 여기서 자식 프로세스가 완료될 때까지 기다릴 수 있습니다.
(output, error) = proc.communicate()

if error:
    print "error:", error

print "output:", output

종료할 때 자식 프로세스를 죽이는 것을 분명하게 만드세요.

import os
import signal
def kill_child():
    if child_pid is None:
        pass
    else:
        os.kill(child_pid, signal.SIGTERM)

import atexit
atexit.register(kill_child)

당신은 두 개의 방법으로 이를 할 수 있습니다. 그들은 check_output 대신에 Popen을 사용해야 합니다. 첫 번째는 다음처럼 try..finally 를 사용하는 더 간단한 방법입니다.

from contextlib import contextmanager

@contextmanager
def run_and_terminate_process(*args, **kwargs):
try:
    p = subprocess.Popen(*args, **kwargs)
    yield p        
finally:
    p.terminate() # sigterm을 보내고, ...
    p.kill()      # sigkill을 보냅니다.

def main():
    with run_and_terminate_process(args) as running_proc:
        # running_proc.stdout.readline() 처럼 당신의 코드를 여기에 작성합니다.

이는 sigint(키보드 인터럽트)와 sigterm을 잡아내지만, sigkill(-9로 kill 스트립트 실행)을 잡아내지 못합니다.

다른 방법은 좀 더 복잡한데 ctypes의 rctl PR_SET_PDEATHSIG을 사용하는 것입니다. 시스템은 자식에게 시그널을 보낼것이고 부모는 어떤 이유(심지어 sigkill)로든 종료합니다.

import signal
import ctypes
libc = ctypes.CDLL("libc.so.6")
def set_pdeathsig(sig = signal.SIGTERM):
    def callable():
        return libc.prctl(1, sig)
    return callable
p = subprocess.Popen(args, preexec_fn = set_pdeathsig(signal.SIGTERM))
반응형
반응형

출처 : https://stackoverflow.com/questions/36476841/python-how-to-read-stdout-of-subprocess-in-a-nonblocking-way/36477512

nonblocking 방법으로 subprocess의 출력을 읽는 방법

저는 subprocess를 시작하고 표준 출력을 확인하는 간단한 python script를 작성하려고 합니다.

여기에 코드의 스니펫이 있습니다.

process = subprocess.Popen([path_to_exe, os.path.join(temp_dir,temp_file)], stdout=subprocess.PIPE)
while True:   
    output=process.stdout.readline()
    print "test"

문제는 script가 output=process.stdout.readline()에서 대기하고 subprocess가 끝난 후에만 print "test"를 실행하는 것입니다.

subprocess가 종료되는 것을 기다리지 않고 표준 출력을 읽어 그것을 출력하는 방법이 있을까요?

제가 시작한 subprocess는 제가 소스 코드를 가지고 있지 않은 윈도우즈 바이너리입니다.

비슷한 질문을 몇 개 찾았지만 그 답변은 리눅스에서만 적용할 수 있거나 제가 시작한 subprocess의 소스를 가지고 있을 경우에만 적용할 수 있었습니다.


2개의 답변 중 1 개의 답변만 추려냄.

select 모듈을 확인하세요.

import subprocess
import select
import time

x=subprocess.Popen(['/bin/bash','-c',"while true; do sleep 5; echo yes; done"],stdout=subprocess.PIPE)

y=select.poll()
y.register(x.stdout,select.POLLIN)

while True:
  if y.poll(1):
     print x.stdout.readline()
  else:
     print "nothing here"
     time.sleep(1)

편집:

POSIX가 아닌 시스템을 위한 쓰레드 처리된 해결책입니다.

import subprocess
from threading import Thread 
import time

linebuffer=[]
x=subprocess.Popen(['/bin/bash','-c',"while true; do sleep 5; echo yes; done"],stdout=subprocess.PIPE)

def reader(f,buffer):
   while True:
     line=f.readline()
     if line:
        buffer.append(line)
     else:
        break

t=Thread(target=reader,args=(x.stdout,linebuffer))
t.daemon=True
t.start()

while True:
  if linebuffer:
     print linebuffer.pop(0)
  else:
     print "nothing here"
     time.sleep(1)
반응형
반응형

출처

https://stackoverflow.com/questions/7938585/what-does-param-mean-in-scala


스칼라에서 파라미터:_* 는 무엇을 뜻합니까?

스칼라(2.9.1)로 새로워지면서, List[Event]가 있고 이를 Queue[Event]로 복사하고 싶습니다. 하지만 다음 문법은 대신에 Queue[List[Event]]를 yield 합니다. 

val eventQueue = Queue(events)

이러한 이유로 다음은 작동합니다.

val eventQueue = Queue(events : _*)

하지만 저는 이것이 무엇인지 왜 작동 하는지 이해하고 싶습니다. Queue.apply 함수의 signature를 이미 보았습니다.

def apply[A](elems: A*)

그리고 저는 첫 번째 시도가 왜 작동하지 않는지와 두 번째(_*)의 의미가 무엇인지 이해하고 싶습니다. 이 경우 :와 _*는 무엇입니까? 그리고 왜 apply함수는 Iterable[A]를 취하지 않는 것입니까?

이 발생할 것입니다.

1개의 답변만 발췌

a: A는 타입 선언(ascription)입니다. 스칼라에서 타입 선언(ascriptions)의 목적은 무엇입니까? 라는 글을 보세요.

: _*는 가변 인자 시퀀스로 시퀀스 타입을 하나의 인수로 취급 하겠다고 컴파일러에게 알리는 타입 선언(ascription)의 특별한 인스턴스 입니다.

시퀀스나 iterable한 하나의 요소를 가지는 Queue.apply를 사용한 Queue를 생성하는 것은 완전히 유효합니다. 그래서 이는 하나의 Iterable[A]가 주어질 때 정확히 발생합니다.

반응형

+ Recent posts