【问题标题】:Using argv to change directory upon running python file在运行 python 文件时使用 argv 更改目录
【发布时间】:2018-06-16 04:42:25
【问题描述】:

我目前有一个 python 文件,连同一个外部参数,将在时间戳文件夹内运行时分析数据(例如,我将 readA3200dat.pyParameterFile.ini 移动到名为 201806151534 的文件夹中,等等)。但是我想使用argv 来消除不断将这些文件移入和移出文件夹的需要。

因为我的代码很长,所以我希望能够编写一个名为main 的函数,它基本上会在将python readA3200dat.py <FILENAME> 输入到命令行并像往常一样执行代码时移动到<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 ##

因为我没有使用argv 语法的经验,我不确定在哪里添加sys.argv[0] 等内容。

我试图创建一个函数__main__(argv) 并告诉它更改目录,然后正常执行我的其余代码,但它不执行代码。相反,它告诉我:

avg_set = avg_set/(len(settle_data))
ZeroDivisionError: integer division or modulo by zero

我认为这是因为程序实际上并没有更改为带时间戳的文件夹,所以它看不到文件夹中的 .dat 文件。

我将如何实现argv 以便能够在不同的文件中使用此代码?

【问题讨论】:

  • os.chdir(sys.argv[1])?尚不完全清楚您要问什么,但我敢打赌,您发布的代码至少有 90% 是无关紧要的。
  • 抱歉 - 我包含了很多代码,因为我不确定是否应该在大部分代码中引用 argv,或者只是在函数 readA3200dat() 之外。我正在尝试确定如何获取所有这些代码并在将python readA3200dat.py <FILENAME> 放入命令行时指定为<FILENAME> 的任何文件中运行它。
  • 不确定您所说的“获取所有这些代码并在任何文件中运行它”是什么意思;您几乎肯定希望在数据文件夹之外有一个脚本,只需将其指向不同的目录。你没有把你的代码放在任何不同的地方。

标签: python argv


【解决方案1】:

您提出的策略很好;您的核心问题是您没有正确处理 argv 的值。如果您想按照原来的计划进行,请调试您的脚本(请参阅pdb)以查看argv 的值。然后调整您的代码以获取您想要的部分,并将它们传递给__main__

另外,我建议您使用optparse 而不是argv。它可以帮助您遵循命令行工具的现代约定并提供文档。

【讨论】:

    猜你喜欢
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    • 2022-10-15
    • 1970-01-01
    • 2021-04-07
    • 2011-05-02
    相关资源
    最近更新 更多