Pasar argumentos de línea de comando a Python

Pasar argumentos de línea de comando a Python

Estoy tratando de escribir un argumento de línea de comando que incluirá un nombre de archivo, que luego intentará abrir el archivo y leer el contenido del archivo dentro de la línea de comando de Linux, si no se pasa ningún argumento, simplemente abrirá el archivo que está predefinido dentro del Código. Actualmente, cuando voy a ejecutar python file.py /home/Desktop/TestFile

Recibo un error: argumentos no reconocidos:

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: 

Respuesta1

Debo decir que tu código me hizo rascarme un poco la cabeza.

Así es como lo haría:

#!/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)

Ahora, si ejecuto este script, obtengo este resultado cuando NO paso un argumento, usando así el fileName( myFile) que está en la función:

./args.py
foo
bar
baz

Revisemos dos veces el archivo myFile.

cat myFile 
foo
bar
baz

Esto es lo que sucede cuando especifico un archivo falso:

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

Y finalmente, cuando especifico un archivo correcto 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

El principal problema con su código es este:

FILENAME = first

La firstvariable contiene la lista completa, es decir sys.argv, no se puede abrir un archivo con un elemento de lista como argumento (open). Mira esto:

#!/usr/bin/env python3

import sys

first = sys.argv
FILENAME = first

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

Ahora cuando ejecuto me sale esto:

./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']

Además, parece que nunca configuraste la variable filename.

Respuesta2

#!/usr/bin/env python
import sys

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

openfile(sys.argv[1])

Inténtalo, esto funcionará, al menos para leer el archivo en la terminal.

información relacionada