В Python аргументы командной строки без импорта?

Можно ли в Python получить аргументы командной строки без импорта sys (или любого другого модуля)?


person Daniel Filipe    schedule 08.12.2014    source источник
comment
meta.stackexchange.com/questions/66377/what -is-xy-проблема   -  person Ignacio Vazquez-Abrams    schedule 09.12.2014
comment
Я почти уверен, что есть какой-то грязный хак, который делает это возможным. Особенно, если требования нечеткие...   -  person Oleh Prypin    schedule 09.12.2014
comment
Прежде всего, может быть ссылка на sys в каком-то встроенном   -  person Oleh Prypin    schedule 09.12.2014


Ответы (4)


Да, если вы используете Linux.

Если вы знаете идентификатор процесса, вы можете прочитать его файл /proc/{pid}/cmdline, который содержит список аргументов командной строки, разделенных нулем:

PROCESS_ID = 14766
cmdline = open("/proc/" + str(pid) + "/cmdline").read()
print cmdline.split("\0")

Но трудно узнать идентификатор процесса до его запуска. Но есть решение! Посмотрите на ВСЕ процессы!

PROGRAM_NAME = "python2\0stack.py"
MAX_PID = int(open("/proc/sys/kernel/pid_max").read())    

for pid in xrange(MAX_PID):
    try:
        cmd = open("/proc/" + str(pid) + "/cmdline").read().strip("\0")
        if PROGRAM_NAME in cmd:
            print cmd.split("\0")
            break
    except IOError:
        continue

Поэтому, если мы запустим python2 stack.py arg1 arg2 arg3 в оболочке, будет напечатан список аргументов командной строки. Это предполагает, что у вас есть только один процесс, выполняющий сценарий в данный момент времени.

PS., MAX_PID - это максимальный PID в вашей системе. Вы можете найти его в /proc/sys/kernel/pid_max.

ППС. Никогда, никогда, никогда не пишите подобный код. Этот пост был на 49% шуткой.

person jme    schedule 08.12.2014
comment
Я надеялся на некоторые умные решения, как это! Спасибо! :) - person Daniel Filipe; 10.05.2015
comment
Есть ли причина, по которой вы просто не используете /proc/self? Ответ выглядит так: open('/proc/self/cmdline').read().split('\0'). man proc не упоминает, когда он был добавлен, но /proc/self упоминается в этом вопросе за два года до этого ответа, так что он не кажется очень новым. - person Luc; 07.05.2019

Нет. Вы должны импортировать sys, чтобы получить sys.argv, где аргументы расположены

person Andy♦    schedule 08.12.2014

Нет. Аргументы командной строки доступны только в sys.argv, к которому нельзя получить доступ без импорта sys.
Могу я спросить, почему вы не хотите импортировать sys?

person yvyas    schedule 08.12.2014
comment
Не отвечает на вопрос и просит разъяснений, это не ответ, а комментарий. - person Luc; 07.05.2019

В Linux это даст вам массив, идентичный тому, который sys.argv вернет:

argv = open('/proc/self/cmdline').read().split('\0')
person Luc    schedule 08.05.2019