我想在执行一些初始化脚本init.py
后,用Python运行一个名为work.py
的脚本。
如果我想要交互式会话,可以执行python -i init.py
或设置PYTHONSTARTUP=/path/to/init.py
,但我想要执行另一个脚本。
由于这是一个经常出现的通用情况(init.py
设置环境,因此始终相同),我非常希望不从work.py
中引用init.py
。怎么做?如果我需要从脚本而不是提示符中执行该操作,是否会有任何变化?
非常感谢。
比C0deH4cker的被接受答案更普遍的是,在Python手册的第2.2.5节 - 自定义模块中讨论了这个问题。基本思路是,为了获得特殊启动脚本的位置,需要执行以下Python代码,例如在解释器的交互会话中:
>>> import site
>>> site.getusersitepackages()
'/home/user/.local/lib/python3.2/site-packages'
输出应该与文件 sitecustomize.py
中的位置完全相同。
python -m site
(适用于 Python 2 和 Python 3)会显示此信息(查找以 USER_SITE:
开头的行)以及更多信息。 对于 USER_BASE
和 USER_SITE
目录,它甚至会检查目录是否存在。 - ackPython有一个特殊的脚本,在启动时运行。在我的平台上,它位于/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
(目录存在,文件不存在),并且对先前状态没有任何更改。 - gt6989bsitecustomize.py
和 usercustomize.py
模块在解释器运行后续脚本的命名空间中不是同一个,因此无法像在交互式启动文件中那样修改全局环境。如果有可能的话,我很乐意接受更正。 - Piotr Dobrogost
python -c 'import init; import work'
呢?或者更不太优雅一些,python -c 'execfile("init.py"); execfile("work.py")'
。 - mgilsonpy work.py
,其中py()
将是一个定义好的shell命令,但这会导致其他问题。如果有一种干净的方法始终执行相同的初始化脚本,那么我更喜欢这种方式... - gt6989binit.py
),在启动Python时在调用任何其他内容之前被调用,就好像您正在执行类似于cat init.py main.py | python
的操作,而与main.py
文件的实际内容无关? - mgilson