【发布时间】:2014-12-08 22:35:38
【问题描述】:
在 Python 中,是否可以在不导入 sys(或任何其他模块)的情况下获取命令行参数?
【问题讨论】:
-
我很确定有一些肮脏的黑客使这成为可能。特别是如果要求不精确......
-
首先,某些内置可能会引用sys
标签: python console arguments args
在 Python 中,是否可以在不导入 sys(或任何其他模块)的情况下获取命令行参数?
【问题讨论】:
标签: python console arguments args
是的,如果您使用的是 Linux。
如果您知道进程 ID,则可以读取其 /proc/{pid}/cmdline 文件,该文件包含一个以空值分隔的命令行参数列表:
PROCESS_ID = 14766
cmdline = open("/proc/" + str(pid) + "/cmdline").read()
print cmdline.split("\0")
但是在启动进程之前很难知道进程 ID。但有一个解决方案!查看所有流程!
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
因此,如果我们在 shell 中运行python2 stack.py arg1 arg2 arg3,则会打印出命令行参数列表。这假设您在给定时间只有一个进程运行脚本。
PS.,MAX_PID 是您系统上的最大 PID。你可以在/proc/sys/kernel/pid_max找到它。
PPS。从来没有,ever,ever 写过这样的代码。这篇文章是 49% 的笑话。
【讨论】:
/proc/self?答案似乎只是:open('/proc/self/cmdline').read().split('\0')。 man proc 没有提及是什么时候添加的,但是 /proc/self 被引用了 in this question two years before this answer 所以看起来不是很新。
没有。必须导入sys才能得到sys.argv,也就是参数所在的位置
【讨论】:
没有。命令行参数仅在 sys.argv 中可用,除非导入 sys,否则无法访问。
请问为什么不想导入sys?
【讨论】:
在 Linux 上,这将为您提供一个与 sys.argv 返回的数组相同的数组:
argv = open('/proc/self/cmdline').read().split('\0')
【讨论】: