2016-08-13 98 views
0

我正在使用pynetdicom腳本從dcm4chee中獲取數據。 來運行我需要從命令行傳遞參數的腳本。 但我已經有一些變量或其他對象的值,我需要從那裏使用,但我沒有得到如何將該值傳遞給解析器或是否可以不解析。從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

你有一個程序_program1.py_和_variable1_中的一些數據,並且你想使用帶有_variable1_作爲參數的_qrscu.py_程序? –

+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

您可以將與使用上面的腳本使用pyhton模塊0在你自己的代碼中。它將允許您使用您根據變量或對象定義的參數運行腳本。

示例:假設您有一些變量your_arg_1 ... your_arg_n可供grscu.py使用。然後,你可以通過這些變量的腳本

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

的「ARGS = parser.parse_args()」中的腳本將抓住變量,並將它們傳遞給MyAE對象。有關argparse的更多信息,請參閱link