[python] subprocess, Popen
Note )
subprocess로 실행하는 바이너리가 출력→입력대기 순서로 진행할 때,
``c read() -> write()``를 주었는데도 제대로 동작하지 않는 경우가 있다.
이는 실행하는 바이너리 자체에서 입력 대기 하기 전에 출력을 파이썬으로 보내주어야 하는데, 입력 대기가 끝난 이후에 파이썬으로 출력 내용을 보내기 때문에 발생하는 현상으로 보인다. 그래서, 파이썬 단에서는 파이프를 새로 만들든 무슨 짓을 하든 해결이 안되고, 바이너리에서 flush해주는 수 밖에 없는 듯.
Popen
stdio 연결
cat 예제
- `` Popen("cat")``일 때 stdin 지정 안하면 interactive에서는 stdin이 겹쳐서 입력이 잘 안된다.
- ``python stdout=subprocess.PIPE`` 적고 `` p.stdout.read()``하면 왜인지 안된다.
간단하게 사용할 때
```python
import subprocess
subprocess.run(['ls', '-al'], shell=True)
```
* `` WindowsError: [Error 2] The system cannot find the file specified``가 발생하는 경우, Windows에서 `` .exe``말고 다른 확장자는 파일 이름만 적어 실행하는 것이 안되기 때문이다. 확장자까지 입력해주어야 한다.
리턴값을 이용하고 싶은 경우
```python
>>> import subprocess
>>> result = subprocess.run(["ls"], stdout=subprocess.PIPE)
>>> result
CompletedProcess(args=['ls'], returncode=0, stdout=b'__init__.py\n__pycache__\nclean.p
y\ncopy.py\nlog.py\nrun.py\ntest.log\n')
# result = subprocess.check_output(["ls"])
```
구식 OS
구식 OS에서는 `` subprocess`` 모듈이 없어 `` os`` 모듈을 사용해야한다.
```python
import os
os.system ('ls -al | grep "user")
os.popen("command")
```
'Languages & Frameworks > Python' 카테고리의 다른 글
[python] plotly (0) | 2017.07.19 |
---|---|
[python] graph visualization (0) | 2017.07.19 |
[python] with / try-except (0) | 2017.07.02 |
[python] directory parse / glob / pathlib (0) | 2017.07.02 |
[python] 람다(lambda), 함수형 fileter / map / reduce (2) | 2017.07.02 |