Passando argumentos de linha de comando para Python

Passando argumentos de linha de comando para Python

estou tentando escrever um argumento de linha de comando que receberá um nome de arquivo, que tentará abrir o arquivo e ler o conteúdo do arquivo na linha de comando do Linux, se não houver nenhum argumento passado, ele apenas abrirá o arquivo que está pré-definido no Código. atualmente, quando vou executar python file.py /home/Desktop/TestFile

estou recebendo o erro: argumentos não reconhecidos:

def openfile():
    first = sys.argv
    for arg in sys.argv:
        FILENAME = first
        if len(arg) != 1:
            with open(filename) as f:
        else:
            with open(FILENAME) as f: 

Responder1

Devo dizer que seu código me fez coçar um pouco a cabeça.

Aqui está como eu faria isso:

#!/usr/bin/env python3
import sys

def myOpen(aList):
    fileName = "myFile"

    if len(aList) > 1:
        fileName = aList[1]

    try:
        with open(fileName) as f:
            for line in f:
                print(line, end="")
    except IOError:
        print("Can't open file " + fileName + ".")

myOpen(sys.argv)

Agora, se eu executar esse script, obtenho esse resultado quando NÃO passo um argumento, utilizando assim o fileName( myFile) que está na função:

./args.py
foo
bar
baz

Vamos verificar o arquivo myFile.

cat myFile 
foo
bar
baz

Aqui está o que acontece quando eu especifico um arquivo falso:

./args.py foo
Can't open file foo.

E finalmente, quando especifico um arquivo correto como argumento:

./args.py vmstat.txt 
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 2419392  76200 642712    0    0    25    10   20   62  0  0 99  1  0

O principal problema com seu código é este:

FILENAME = first

A firstvariável contém a lista inteira, ou seja sys.argv, você não pode abrir um arquivo com um elemento de lista como argumento para (open). Veja isso:

#!/usr/bin/env python3

import sys

first = sys.argv
FILENAME = first

with open(FILENAME) as f:
    for line in f:
        print(f)

Agora, quando executo, recebo isto:

./faultyArgs.py myFile
Traceback (most recent call last):
  File "./faultyArgs.py", line 8, in <module>
    with open(FILENAME) as f:
TypeError: invalid file: ['./faultyArgs.py', 'myFile']

Além disso, parece que você nunca definiu a variável filename.

Responder2

#!/usr/bin/env python
import sys

def openfile(fn):
    file = open(fn, "r")
    out = file.read()
    print out
    file.close()

openfile(sys.argv[1])

Tente isso, vai funcionar, pelo menos para ler o arquivo no terminal

informação relacionada