В настоящее время у меня есть файл python, который вместе с внешним параметром будет анализировать данные при запуске внутри временных файлов (например, я перемещаю readA3200dat.py
и ParameterFile.ini
в папку с именем 201806151534 и т.д.). Однако я хочу использовать argv
чтобы исключить необходимость постоянного перемещения этих файлов в папки и из них.
Поскольку мой код довольно длинный, я надеялся написать функцию main
, которая в основном переместилась бы в <FILENAME>
при входе python readA3200dat.py <FILENAME>
в командную строку и выполнить код как обычно.
Кроме того, поскольку мне требуется папка параметров, ParameterFile.ini
находится в том же каталоге, я надеялся, что это будет перемещено, но поскольку это всегда одно и то же имя, мне не нужен argv
.
Это мой код (сокращение немного): Примечание: код имеет значение только для отображения общей структуры кодирования - я включаю его строго, потому что я не уверен, где в коде я должен включить синтаксис argv
.
import os
import numpy as np
import re
class DataStructure(object): #Data File Class
'''Object to contain data file information parsed in readA3200dat'''
def __init__(self):
self.AxisName = None
## more like this ##
def readA3200dat(filename):
'''
Takes in the file path of dat file
Returns Data structure with information from dat file
'''
if filename == None: # if filename is None, return None
print("\nWARNING: Filename set to None, returning None")
return None, None
try: # try to open file
f = open(filename, 'r') #open the specified file
except IOError as e:
print ("\nI/O error({0}): {1}\n".format(e.errno, e.strerror))
raise
fileLine = f.readline() #read data in to fileLine list
### Data Reading and Analysis ##
cur_dir = os.getcwd()
folders = os.listdir(cur_dir)
for i in folders:
name, ext = os.path.splitext(i)
if ext == '.dat':
data = readA3200dat(i)
## find average values, std, etc. ##
try:
from configparser import ConfigParser
except ImportError:
from ConfigParser import ConfigParser
config = ConfigParser()
config.read('ParameterFile.ini')
# read values from a section
GainAff = config.getfloat('Section 1', 'gainaff')
## more like this ##
## print values ##
if os.path.isfile("ResultingSettleTimes.txt") == False:
y = open("ResultingSettleTimes.txt", 'w')
y.write('#GainAff / GainVff / FFA / Traj.FIR / RampRate / SettleTime(avg)#')
print '\nPrinting to ResultingSettleTimes.txt'
## Write a bunch of stuff to the .txt file ##
Поскольку я не sys.argv[0]
с использованием синтаксиса argv
, я не уверен, где добавить такие вещи, как sys.argv[0]
и т.д.
Я попытался создать функцию __main__(argv)
и сообщить ей об изменении каталогов, а затем выполнить остальную часть моего кода как обычно, но он не выполняет код. Вместо этого он говорит мне:
avg_set = avg_set/(len(settle_data))
ZeroDivisionError: integer division or modulo by zero
Я думаю, что это потому, что программа фактически не меняется в папку с временными метками, поэтому она не видит файлы.dat в папке.
Как я могу реализовать argv
чтобы использовать этот код в другом файле?
Ваша предлагаемая стратегия прекрасна; ваша основная проблема заключается в том, что вы неправильно обрабатываете значение argv
. Если вы хотите пойти с исходным планом, отлаживайте свой скрипт (см. Pdb), чтобы увидеть значение argv
. Затем отрегулируйте свой код, чтобы захватить нужные части, и передайте их __main__
.
Кроме того, я предлагаю вам использовать optparse
а не argv
. Это помогает вам следовать современным соглашениям для инструментов командной строки и предоставлять документацию.