Python启动脚本

11

我想在执行一些初始化脚本init.py后,用Python运行一个名为work.py的脚本。

如果我想要交互式会话,可以执行python -i init.py或设置PYTHONSTARTUP=/path/to/init.py,但我想要执行另一个脚本。

由于这是一个经常出现的通用情况(init.py设置环境,因此始终相同),我非常希望不从work.py中引用init.py。怎么做?如果我需要从脚本而不是提示符中执行该操作,是否会有任何变化?

非常感谢。


“work” 如何依赖于 “init”?你能否只运行 python -c 'import init; import work' 呢?或者更不太优雅一些,python -c 'execfile("init.py"); execfile("work.py")' - mgilson
“work”需要在执行之前先执行“init”。你所建议的可能有效(我现在会尝试),但这并不是理想的方式——每次运行Python脚本时,我都需要像这样做。我可以创建一个别名或者一个shell命令来引用它,例如py work.py,其中py()将是一个定义好的shell命令,但这会导致其他问题。如果有一种干净的方法始终执行相同的初始化脚本,那么我更喜欢这种方式... - gt6989b
所以,(只是为了明确),您想要全局定义一个脚本(init.py),在启动Python时在调用任何其他内容之前被调用,就好像您正在执行类似于 cat init.py main.py | python 的操作,而与 main.py 文件的实际内容无关? - mgilson
2个回答

12

比C0deH4cker的被接受答案更普遍的是,在Python手册的第2.2.5节 - 自定义模块中讨论了这个问题。基本思路是,为了获得特殊启动脚本的位置,需要执行以下Python代码,例如在解释器的交互会话中:

>>> import site
>>> site.getusersitepackages()
'/home/user/.local/lib/python3.2/site-packages'

输出应该与文件 sitecustomize.py 中的位置完全相同。


1
这应该是被接受的答案,因为它更加便携。 - magu_
2
运行 python -m site(适用于 Python 2 和 Python 3)会显示此信息(查找以 USER_SITE: 开头的行)以及更多信息。 对于 USER_BASEUSER_SITE 目录,它甚至会检查目录是否存在。 - ack

7

Python有一个特殊的脚本,在启动时运行。在我的平台上,它位于/usr/lib/python2.5/site-packages/sitecustomize.py(如果我没记错的话)。因此,您可以将init.py放在该目录中,并与导入它的sitecustomize.py脚本一起使用,或者只需将init.py的内容粘贴到sitecustomize.py中。


无法使其工作-将init.py放入 /path/to/python/site-packages/site-customize.py(目录存在,文件不存在),并且对先前状态没有任何更改。 - gt6989b
1
糟糕,它是sitecustomize.py(没有连字符)。正在编辑答案。 - C0deH4cker
谢谢,那简直像神奇一样起作用。但我希望你能不使用黑客手段来实现这个。目前暂时还没有更好的解决办法,所以我很愿意接受你的答案。感谢你的帮助。 - gt6989b
看起来 sitecustomize.pyusercustomize.py 模块在解释器运行后续脚本的命名空间中不是同一个,因此无法像在交互式启动文件中那样修改全局环境。如果有可能的话,我很乐意接受更正。 - Piotr Dobrogost

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接