2010-05-18 1 views
3

. /home/db2v95/sqllib/db2profile 명령을 실행해야 파이썬 2.6에서 import ibm_db_dbi을 수행 할 수 있습니다.파이썬에서 BASH 명령 실행 - 동일한 프로세스에서

내가 파이썬 작동 입력하기 전에 실행 :

[email protected]:~$ . /home/db2v95/sqllib/db2profile 
[email protected]:~$ python 
Python 2.6.4 (r264:75706, Dec 7 2009, 18:45:15) 
[GCC 4.4.1] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import ibm_db_dbi 
>>> 

을하지만 오류가 os.system(". /home/db2v95/sqllib/db2profile") 또는 subprocess.Popen([". /home/db2v95/sqllib/db2profile"]) 결과를 사용하여 파이썬에서 그것을 실행. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 편집

:이 오류는 내가받을 수있다 :

> Traceback (most recent call last): 
> File "<file>.py", line 8, in 
> <module> 
>  subprocess.Popen([". /home/db2v95/sqllib/db2profile"]) 
> File 
> "/usr/lib/python2.6/subprocess.py", 
> line 621, in __init__ 
>  errread, errwrite) File "/usr/lib/python2.6/subprocess.py", 
> line 1126, in _execute_child 
>  raise child_exception OSError: [Errno 2] No such file or directory 
+0

총 추측이지만 실제로 스크립트는 환경에서 하위 프로세스를 실행하여 작동하지 않는 것으로 보이는 것처럼 보입니다. – abyx

+0

@abyx : 사실 일지라도 주어진 문제와는 무관합니다. – SilentGhost

답변

-1

어쩌면 os.popen은 당신이 찾고있는 무엇을 (더 나은 아직 popen[2-4] 변종 중 하나)? 예 :

import os 
p = os.popen(". /home/b2v95/sqllib/db2profile") 
p.close() # this will wait for the command to finish 
import ibm_db_dbi 

편집 : 나는 당신의 오류가 No such file or directory 말한다 볼. 다음과 같이 점없이 실행 해보십시오.

os.popen("/home/b2v95/sqllib/db2profile") 

이 방법이 효과가 없다면 사용자 환경과 관련이있을 수 있습니다. 어쩌면 파이썬이 수감되고/chrooted일까요?

+1

'os.popen'은 더 이상 사용되지 않습니다. – SilentGhost

+1

오, 이런. 큰 빨간 경고를 보지 못했습니다. 미안합니다. – Felix

+0

더 이상 사용되지 않을뿐만 아니라 파이프를 열고 출력을 무시하기 위해 이런 식으로 사용하지 않아야합니다. 셸 명령과 통신하지 않고 쉘 명령을 실행하고 싶다면'os.popen()'이 아니라'os.system()'또는'subprocess.call()'을 사용하십시오. –

0

당신은 할 필요가 : '.'당신은을 요구하고있다

subprocess.Popen(['.', '/home/db2v95/sqllib/db2profile'], shell=True) 
+0

"작동"할 수도 있지만 (예외는 발생하지 않음) 예상 한대로 작동하지 않을 가능성이 큽니다. 파일이 '출처'이기 때문에 아마도 일부 환경 변수를 설정합니다. 이러한 변수는 Popen에 의해 시작된 쉘에서만 설정되며 파이썬 스크립트 호출에서는 볼 수 없습니다. –

+0

이 결과 : 역 추적 (마지막으로 가장 최근 통화) : 파일 "gagnagrunnur.py", 라인 (14)을, 수입 ibm_db_dbi 파일에서 "/usr/local/lib/python2.6/dist-packages/ibm_db_dbi .py ", line 26, 임포트 ibm_db ImportError : libdb2.so.1 : 공유 오브젝트 파일을 열 수 없음 : 해당 파일 또는 디렉토리가 없습니다. 명령 행을 사용하여 작업했음을 강조합니다. –

+0

@baldur : 프로세스가 종료되기를 기다리고 계십니까? – SilentGhost

10

을 쉘 명령. 이 명령은 '현재 프로세스에서이 셸 파일 실행'을 의미합니다. 파이썬은 쉘 스크립트 인터프리터가 아니기 때문에 파이썬 프로세스에서 쉘 파일을 실행할 수 없습니다.

/home/b2v95/sqllib/db2profile은 일부 쉘 환경 변수를 설정합니다. system() 함수를 사용하여 읽으면 변수는 실행 된 셸에서만 변경되며 해당 셸 (스크립트)을 호출하는 프로세스에서는 볼 수 없습니다.

파이썬 스크립트를 시작하기 전에 만이 파일을로드 할 수 있습니다. . /home/b2v95/sqllib/db2profile을 수행 할 쉘 래퍼 스크립트를 만들고 파이썬 스크립트를 실행할 수 있습니다.

다른 방법은 db2profile에 무엇이 들어 있는지 확인하는 것입니다. 그 경우에만 NAME=value 라인, 당신은 파이썬 스크립트에서 구문 분석하고 os.environ 얻은 데이터를 업데이 트하십시오. 스크립트가 (값을 얻기 위해 다른 것을 호출하는 것과 같이) 더 많은 일을한다면, 파이썬에서 전체 스크립트를 재 구현할 수 있습니다.

업데이트 아이디어 : 스크립트가 같은 쉘 env 명령을 작성하고 출력을 읽은 후 파이프는, 쉘에 (는 popen을 사용하여), 파이썬으로 스크립트를 읽어 보시기 바랍니다. 이렇게하면 쉘에 정의 된 모든 변수를 얻을 수 있습니다. 이제 변수를 읽을 수 있습니다. 이 같은

뭔가 :

작업중인 어떤 OS와 사용하고있는 DB2 버전
shell = subprocess.Popen(["sh"], stdin=subprocess.PIPE, stdout=subprocess.PIPE) 
script = open("/home/db2v95/sqllib/db2profile", "r").read() 
shell.stdin.write(script + "\n") 
shell.stdin.write("env\n") 
shell.stdin.close() 
for line in shell.stdout: 
    name, value = line.strip().split("=", 1) 
    os.environ[name] = value 
+0

아, 좋은 지적 - 실제로 db2profile은 쉘 환경 변수를 설정합니다. 불행히도 (프로젝트의 성격으로 인해) 쉘 래퍼를 사용하여 파이썬 스크립트를 호출 할 수는 없지만 db2profile은 길고 환경 변수를 다소 복잡하게 포함하고 있습니다. 파이썬에서 전체 파일을 실행하는 방법은 무엇입니까? –

+0

I. 파이썬에서 많은 과제, 환경 변수 및 함수를 사용하여 BASH 스크립트를 실행할 수 있습니까? 아니면 파이썬에서 전체 코드를 다시 작성해야합니까? –

+0

어떻게 할 수 있었는지 생각났습니다. 내 게시물에 대한 업데이트를 확인하십시오. –

0

확실하지. 새 버전 (최소 9.5 이상, 9.0 또는 9.1에 대해 확실하지 않음)은 db2clp를 **$$**으로 설정하여 작동합니다. DB2는 보통 LUW이므로 linux/unix에서도 작동 할 수 있습니다.그러나 AIX에서는 올바른 DB 인스턴스에 연결하기 위해 프로필 스크립트를 실행해야합니다. 스크립트가하는 일을 너무 많이 확인하지 않았습니다.