2016-08-13 3 views
0

dyn4chee에서 데이터를 가져 오기 위해 pynetdicom 스크립트를 사용하고 있습니다. 스크립트를 실행하려면 명령 줄에서 인수를 전달해야합니다. 하지만 이미 일부 변수 또는 다른 개체에서 그 값을 사용하고 거기에서 사용해야하지만 어떻게 그 값을 파서에 전달할 수 없는지 또는 파싱없이 수행 할 수 있습니까?argparse에서 명령 줄 대신 변수에서 값 가져 오기

명령 줄을 통과하는 대신 일부 변수를 사용하여 값을 전달하는 방법을 알려주십시오.

스크립트 :

#!/usr/bin/python 

""" 
For help on usage, 
python qrscu.py -h 

""" 

import argparse 
from netdicom.applicationentity import AE 
from netdicom.SOPclass import * 
from dicom.dataset import Dataset, FileDataset 
from dicom.UID import ExplicitVRLittleEndian, ImplicitVRLittleEndian, ExplicitVRBigEndian 
import netdicom 
import tempfile 

# parse commandline 
parser = argparse.ArgumentParser(description='storage SCU example') 
print "parser", parser 
parser.add_argument('remotehost') 
parser.add_argument('remoteport', type=int) 
parser.add_argument('searchstring') 
parser.add_argument('-p', help='local server port', type=int, default=9999) 
parser.add_argument('-aet', help='calling AE title', default='PYNETDICOM') 
parser.add_argument('-aec', help='called AE title', default='REMOTESCU') 
parser.add_argument('-implicit', action='store_true', help='negociate implicit transfer syntax only', default=False) 
parser.add_argument('-explicit', action='store_true', help='negociate explicit transfer syntax only', default=False) 

args = parser.parse_args() 
print "args :::: ", type(args), args 

if args.implicit: 
    ts = [ImplicitVRLittleEndian] 
elif args.explicit: 
    ts = [ExplicitVRLittleEndian] 
else: 
    ts = [ 
     ExplicitVRLittleEndian, 
     ImplicitVRLittleEndian, 
     ExplicitVRBigEndian 
     ] 

# call back 
def OnAssociateResponse(association): 
    print "Association response received" 


def OnAssociateRequest(association): 
    print "Association resquested" 
    return True 

def OnReceiveStore(SOPClass, DS): 
    print "Received C-STORE", DS.PatientName 
    try: 
     # do something with dataset. For instance, store it. 
     file_meta = Dataset() 
     file_meta.MediaStorageSOPClassUID = '1.2.840.10008.5.1.4.1.1.2' 
     file_meta.MediaStorageSOPInstanceUID = "1.2.3" # !! Need valid UID here 
     file_meta.ImplementationClassUID = "1.2.3.4" # !!! Need valid UIDs here 
     filename = '%s/%s.dcm' % (tempfile.gettempdir(), DS.SOPInstanceUID) 
     ds = FileDataset(filename, {}, file_meta=file_meta, preamble="\0" * 128) 
     ds.update(DS) 
     ds.save_as(filename) 
     print "File %s written" % filename 
    except: 
     pass 
    # must return appropriate status 
    return SOPClass.Success 

# create application entity with Find and Move SOP classes as SCU and 
# Storage SOP class as SCP 
MyAE = AE(args.aet, args.p, [PatientRootFindSOPClass, 
          PatientRootMoveSOPClass, 
          VerificationSOPClass], [StorageSOPClass], ts) 
MyAE.OnAssociateResponse = OnAssociateResponse 
MyAE.OnAssociateRequest = OnAssociateRequest 
MyAE.OnReceiveStore = OnReceiveStore 
MyAE.start() 


# remote application entity 
RemoteAE = dict(Address=args.remotehost, Port=args.remoteport, AET=args.aec) 

# create association with remote AE 
print "Request association" 
assoc = MyAE.RequestAssociation(RemoteAE) 

# perform a DICOM ECHO 
print "DICOM Echo ... ", 
if assoc: 
    st = assoc.VerificationSOPClass.SCU(1) 
    print 'done with status "%s"' % st 

    print "DICOM FindSCU ... ", 
    print "\n\n----------------------------------------------------------------------\n\n" 
    d = Dataset() 
    d.StudyDate = args.searchstring 
    d.QueryRetrieveLevel = "STUDY" 
    d.PatientID = "*" 
    study = [x[1] for x in assoc.PatientRootFindSOPClass.SCU(d, 1)][:-1] 
    print 'done with status "%s"' % st 
    print "\n\n\n Cont...", study 
    print "\n\n----------------------------------------------------------------------\n\n" 
    # loop on patients 
    for pp in study: 
     print "\n\n----------------------Pateint Detals------------------------------------------------\n\n" 
     print "%s - %s" % (pp.StudyDate, pp.PatientID) 
     # find studies 
     d = Dataset() 
     d.PatientID = pp.PatientID 
     d.QueryRetrieveLevel = "STUDY" 
     d.PatientName = "" 
     d.StudyInstanceUID = "" 
     d.StudyDate = "" 
     d.StudyTime = "" 
     d.StudyID = "" 
     d.ModalitiesInStudy = "" 
     d.StudyDescription = "" 
     studies = [x[1] for x in assoc.PatientRootFindSOPClass.SCU(d, 1)][:-1] 
     # loop on studies 
     for st in studies: 
      print "\n study :: ", studies 
      print "\n\n---------------------------Study---------------------------\n\n" 
      print " %s - %s %s" % (st.StudyDescription, st.StudyDate, st.StudyTime) 
      d = Dataset() 
      d.QueryRetrieveLevel = "SERIES" 
      d.StudyInstanceUID = st.StudyInstanceUID 
      d.SeriesInstanceUID = "" 
      d.InstanceNumber = "" 
      d.Modality = "" 
      d.SeriesNumber = "" 
      d.SeriesDescription = "" 
      d.AccessionNumber = "" 
      d.SeriesDate = "" 
      d.SeriesTime = "" 
      d.SeriesID = "" 
      d.NumberOfSeriesRelatedInstances = "" 
      series = [x[1] for x in assoc.PatientRootFindSOPClass.SCU(d, 1)][:-1] 

      # print series uid and number of instances 
      if series: 
       for se in series: 
        print "\n\n---------------------------Series---------------------------\n\n" 
        print "\n\n\n series", se 
        print " %15s - %10s - %35s - %5s" % (se.SeriesNumber, se.Modality, se.SeriesDescription, se.NumberOfSeriesRelatedInstances) 

    print "Release association" 
    assoc.Release(0) 

    # done 
    MyAE.Quit() 
else: 
    print "Failed to create Association." 

# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: 
+0

_variable1_에 _program1.py_ 및 _variable1_에 _variable1_이있는 프로그램을 사용하고 싶습니다. –

+0

모든 것을 함수 안에 넣으십시오. – Daniel

답변

1

넣어 모든 내부 기능과 당신이 좋아하는 곳마다 그들에게 전화 : 좋아

#!/usr/bin/python 
""" 
For help on usage, 
python qrscu.py -h 

""" 
import os 
import argparse 
from netdicom.applicationentity import AE 
from netdicom.SOPclass import * 
from dicom.dataset import Dataset, FileDataset 
from dicom.UID import ExplicitVRLittleEndian, ImplicitVRLittleEndian, ExplicitVRBigEndian 
import netdicom 
import tempfile 

# call back 
def OnAssociateResponse(association): 
    print "Association response received" 

def OnAssociateRequest(association): 
    print "Association resquested" 
    return True 

def OnReceiveStore(SOPClass, DS): 
    print "Received C-STORE", DS.PatientName 
    try: 
     # do something with dataset. For instance, store it. 
     file_meta = Dataset() 
     file_meta.MediaStorageSOPClassUID = '1.2.840.10008.5.1.4.1.1.2' 
     file_meta.MediaStorageSOPInstanceUID = "1.2.3" # !! Need valid UID here 
     file_meta.ImplementationClassUID = "1.2.3.4" # !!! Need valid UIDs here 
     filename = os.path.join(tempfile.gettempdir(), DS.SOPInstanceUID + '%s.dcm') 
     ds = FileDataset(filename, {}, file_meta=file_meta, preamble="\0" * 128) 
     ds.update(DS) 
     ds.save_as(filename) 
     print "File %s written" % filename 
    except Exception as e: 
     print "Some exception occured", e 
    # must return appropriate status 
    return SOPClass.Success 

def print_data(remotehost, remoteport, searchstring, local_port=9999, 
     calling_title='PYNETDICOM', called_title='REMOTESCU', 
     ts=(ExplicitVRLittleEndian, ImplicitVRLittleEndian, ExplicitVRBigEndian)): 
    # create application entity with Find and Move SOP classes as SCU and 
    # Storage SOP class as SCP 
    MyAE = AE(calling_title, local_port, [PatientRootFindSOPClass, 
           PatientRootMoveSOPClass, 
           VerificationSOPClass], [StorageSOPClass], ts) 
    MyAE.OnAssociateResponse = OnAssociateResponse 
    MyAE.OnAssociateRequest = OnAssociateRequest 
    MyAE.OnReceiveStore = OnReceiveStore 
    MyAE.start() 

    # remote application entity 
    RemoteAE = dict(Address=remotehost, Port=remoteport, AET=called_title) 

    # create association with remote AE 
    print "Request association" 
    assoc = MyAE.RequestAssociation(RemoteAE) 

    # perform a DICOM ECHO 
    print "DICOM Echo ... ", 
    if not assoc: 
     print "Failed to create Association." 
     return 

    st = assoc.VerificationSOPClass.SCU(1) 
    print 'done with status "%s"' % st 

    print "DICOM FindSCU ... ", 
    print "\n\n----------------------------------------------------------------------\n\n" 
    d = Dataset() 
    d.StudyDate = searchstring 
    d.QueryRetrieveLevel = "STUDY" 
    d.PatientID = "*" 
    study = [x[1] for x in assoc.PatientRootFindSOPClass.SCU(d, 1)][:-1] 
    print 'done with status "%s"' % st 
    print "\n\n\n Cont...", study 
    print "\n\n----------------------------------------------------------------------\n\n" 
    # loop on patients 
    for pp in study: 
     print "\n\n----------------------Pateint Detals------------------------------------------------\n\n" 
     print "%s - %s" % (pp.StudyDate, pp.PatientID) 
     # find studies 
     d = Dataset() 
     d.PatientID = pp.PatientID 
     d.QueryRetrieveLevel = "STUDY" 
     d.PatientName = "" 
     d.StudyInstanceUID = "" 
     d.StudyDate = "" 
     d.StudyTime = "" 
     d.StudyID = "" 
     d.ModalitiesInStudy = "" 
     d.StudyDescription = "" 
     studies = [x[1] for x in assoc.PatientRootFindSOPClass.SCU(d, 1)][:-1] 
     # loop on studies 
     for st in studies: 
      print "\n study :: ", studies 
      print "\n\n---------------------------Study---------------------------\n\n" 
      print " %s - %s %s" % (st.StudyDescription, st.StudyDate, st.StudyTime) 
      d = Dataset() 
      d.QueryRetrieveLevel = "SERIES" 
      d.StudyInstanceUID = st.StudyInstanceUID 
      d.SeriesInstanceUID = "" 
      d.InstanceNumber = "" 
      d.Modality = "" 
      d.SeriesNumber = "" 
      d.SeriesDescription = "" 
      d.AccessionNumber = "" 
      d.SeriesDate = "" 
      d.SeriesTime = "" 
      d.SeriesID = "" 
      d.NumberOfSeriesRelatedInstances = "" 
      series = [x[1] for x in assoc.PatientRootFindSOPClass.SCU(d, 1)][:-1] 

      # print series uid and number of instances 
      for se in series: 
       print "\n\n---------------------------Series---------------------------\n\n" 
       print "\n\n\n series", se 
       print " %15s - %10s - %35s - %5s" % (se.SeriesNumber, se.Modality, se.SeriesDescription, se.NumberOfSeriesRelatedInstances) 

    print "Release association" 
    assoc.Release(0) 

    # done 
    MyAE.Quit() 

def parse_commandline(): 
    # parse commandline 
    parser = argparse.ArgumentParser(description='storage SCU example') 
    print "parser", parser 
    parser.add_argument('remotehost') 
    parser.add_argument('remoteport', type=int) 
    parser.add_argument('searchstring') 
    parser.add_argument('-p', help='local server port', type=int, default=9999) 
    parser.add_argument('-aet', help='calling AE title', default='PYNETDICOM') 
    parser.add_argument('-aec', help='called AE title', default='REMOTESCU') 
    parser.add_argument('-implicit', action='store_true', help='negociate implicit transfer syntax only', default=False) 
    parser.add_argument('-explicit', action='store_true', help='negociate explicit transfer syntax only', default=False) 

    args = parser.parse_args() 
    print "args :::: ", type(args), args 

    if args.implicit: 
     ts = [ImplicitVRLittleEndian] 
    elif args.explicit: 
     ts = [ExplicitVRLittleEndian] 
    else: 
     ts = [ 
      ExplicitVRLittleEndian, 
      ImplicitVRLittleEndian, 
      ExplicitVRBigEndian 
      ] 
    return args, ts 

if __name__ == '__main__': 
    args, ts = parse_commandline() 
    print_data(args.remotehost, args.remoteport, args.searchstring, args.p, args.aet, args.aec, ts) 

및 사용 :

import your_module 
your_module.print_data(remotehost, remoteport, searchstring) 
0
당신은 통합 할 수

및 사용을 Pythton 모듈을 사용하여 위 코드의 코드를 직접 작성하십시오.. 변수 나 객체에 따라 정의한 인수를 사용하여 스크립트를 실행할 수 있습니다.

예 : grscu.py에서 소비 할 수있는 변수 your_arg_1 ... your_arg_n이 있다고 가정 해 보겠습니다. 그럼 당신은

import subprocess 
r = subprocess.check_call(['grscu.py', your_arg_1, your_arg_2, ..., your_arg_n]) 

와 "인수의 =의 parser.parse_args()"스크립트의 변수를 잡아되고 MyAE 객체에 전달할를 스크립트에 이러한 변수를 전달할 수 있습니다. argparse에 대한 자세한 내용은 link을 참조하십시오.

관련 문제