Можно ли в Python получить аргументы командной строки без импорта sys (или любого другого модуля)?
В Python аргументы командной строки без импорта?
Ответы (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% шуткой.
/proc/self
? Ответ выглядит так: open('/proc/self/cmdline').read().split('\0')
. man proc
не упоминает, когда он был добавлен, но /proc/self
упоминается в этом вопросе за два года до этого ответа, так что он не кажется очень новым.
- person Luc; 07.05.2019
Нет. Вы должны импортировать sys
, чтобы получить sys.argv
, где аргументы расположены
Нет. Аргументы командной строки доступны только в sys.argv
, к которому нельзя получить доступ без импорта sys
.
Могу я спросить, почему вы не хотите импортировать sys?
В Linux это даст вам массив, идентичный тому, который sys.argv
вернет:
argv = open('/proc/self/cmdline').read().split('\0')