æ件æ¯å¨å¯¼å ¥ç¼è¯ã è¿ä¸æ¯ä¸ä¸ªå®å ¨çäºæ ã è¿ä» ä» æ¯å¦æä½ å°å ¶å¯¼å ¥èèä¿åè¾åºã çå°è¿ä¸ªå¸åç±Fredrik Lundhå¼åä¸Effbotã
>>>import main
# main.pyc is created
å½è¿è¡ä¸ä¸ªèæ¬å·¨èå°ä¸ä½¿ç¨* .pycæ件çæ件ã å¦æä½ æä½ æ³è¦ä½ çèæ¬ä¸äºå ¶ä»çåå ï¼é¢ç¼è¯å¯ä»¥ä½¿ç¨compileall模åã
python -m compileall .
compileallç¨æ³
python -m compileall --help
option --help not recognized
usage: python compileall.py [-l] [-f] [-q] [-d destdir] [-x regexp] [directory ...]
-l: don't recurse down
-f: force rebuild even if timestamps are up-to-date
-q: quiet operation
-d destdir: purported directory name for error messages
if no directory arguments, -l sys.path is assumed
-x regexp: skip files matching the regular expression regexp
the regexp is searched for in the full path of the file
åç以ä¸é®é¢ç¼è¾
å¦æååºæ¯æ½å¨çç£çæéçç®å½main.py ï¼ä¸ºä»ä¹Pythonçç¼è¯æ¨¡åï¼
模ååèæ¬å°è¢«è§ä¸ºç¸åã è¿å£æ¯ä»ä¹è§¦åè¦ä¿åçè¾åºã
å¦æåå æ¯å¥½å¤å°æ¯æå°çï¼å¯ä»¥èèçæ åµæ¶ï¼è¯¥èæ¬å°è¢«ç¨äºå¤§éçæ¶é´ï¼è¯¸å¦å¨ä¸ä¸ªCGIåºç¨ç¨åºï¼ã
使ç¨compileallä¸è§£å³è¿ä¸ªé®é¢ã ç±èèæ§è¡çèæ¬å°ä¸ä½¿ç¨*.pyc ï¼é¤éæç¡®è¦æ±ã è¿æè´é¢å½±åï¼æ·±åæ ¼ä¼¦Â·æ¢ çº³å¾·å¨ä»çåç说ã
CGIåºç¨ç¨åºçç»åºçä¾åç¡®å®åºè¯¥ä½¿ç¨åFastCGIçææ¯æ¥è§£å³ã å¦æä½ æ³æ¶é¤ç¼è¯èæ¬çå¼éï¼å¯è½è¦æ¶é¤å¯å¨èè太大ï¼ä½åµæ°æ®åºè¿æ¥å¼éçå¼éã
å å¼å¯¼èæ¬å¯ä»¥ç¨æ¥çè³python -c "import script" ï¼ä½è¿äºé½å¼å¾å榷çé£æ ¼ã
æ ¼ä¼¦Â·æ¢ çº³å¾·æä¾ä¸äºçµææ¥çº æ£åæ¹è¿è¿ä¸ªçæ¡ã
ä¼¼ä¹æ²¡æ人æ³è¿æ ·è¯´ï¼ä½ææ¢è¯å®ççæ¡å¾ç®åï¼æè¿ç§è¡ä¸ºæ²¡æåå®ççç±ã
ææå°ç®å为æ¢ææåºççç±åºæ¬ä¸æ¯ä¸æ£ç¡®çï¼
没æä»ä¹ç¹å«ç主æ件ã å®ä½ä¸ºä¸ä¸ªæ¨¡åå è½½ï¼å¹¶æ¾ç¤ºäºsys.modulesåä»»ä½å ¶ä»æ¨¡åã è¿è¡ä¸»èæ¬æ éå°±æ¯ç¨ç模ååç§°å¯¼å ¥æ´__main__ ã
æä¸æ²¡æä¿å.pycæ件ç±äºåªè¯»ç®å½ä¸çæ件没æé®é¢; èèç®åå°å¿½ç¥å®ï¼å¹¶å¨ç§»å¨ã
ç¼åèæ¬ç好å¤æ¯ç¸åç¼åä»»ä½æ¨¡åçï¼ä¸æµªè´¹æ¶é´æ¯æ¬¡å®çè¿è¡æ¶é´éæ°ç¼è¯èæ¬ã 该ææ¡£æç¡®å°æ¿è®¤è¿ä¸ç¹ï¼âå æ¤ï¼èæ¬çå¯å¨æ¶é´å¯è½ä¼åå°......âï¼ã
å¦ä¸ä¸ªé®é¢éè¦æ³¨æï¼å¦ææ¨è¿è¡python foo.pyåfoo.pycåå¨ï¼å®ä¸ä¼è¢«ä½¿ç¨ ã ä½ å¿ é¡»æç¡®å°è¯´ï¼ python foo.pyc ã è¿æ¯ä¸ä¸ªé常ç³ç³ç主æï¼å®æå³çå½å®æ¯ä¸åæ¥çPythonä¸ä¼èªå¨éæ°ç¼è¯ç.pycæ件çæ件ï¼ç±äº.pyæ件ååï¼ï¼å æ¤å¯¹.pyæ件çæ´æ¹å°ä¸ä¼ä½¿ç¨ï¼ç´å°æ¨æå¨éæ°ç¼è¯ã å®ä¹å°ä¸æåºä¸ä¸ªRuntimeErrorå½»åºå¤±è´¥å¦æå级çPythonå.pycæ件çæä»¶æ ¼å¼ä¸åå ¼å®¹ï¼è¿ç»å¸¸åçã é常æ åµä¸ï¼è¿æ¯ææéæå°å¤çã
ä½ ä¸åºè¯¥éè¦ä¸ä¸ªèæ¬ç§»å¨å°ä¸ä¸ªèæç模åï¼å¹¶æç«äºå¼å¯¼èæ¬æ¬ºéªçPythonå°å ¶é«éç¼åã è¿æ¯ä¸ä¸ªhackishç解å³æ¹æ³ã
å¯ä¸å¯è½ï¼èä¸é常缺ä¹è¯´æåï¼æä¹æ以è½ååæ¯é¿å ä»ä¸å pycæ件被æä¹±ç主ç®å½ã ï¼è¿ä¸æ¯çæ£ççç±;å¦æè¿æ¯ä¸ä¸ªå®é çé®é¢ï¼åpycæ件åºä¿å为ç¹æ件ï¼ãè¿å½ç¶æ²¡æçç±ä¸çè³æä¸ä¸ªé项æ¥åå°è¿ä¸ç¹ã
èç»å¯¹åºè¯¥è½å¤ç¼å主模åã
以æ¥ï¼
å½å®ä».pycæ件æ.pyoæ件æ¶ï¼å®æ¯ä»ä¸ä¸ª.pyæ件é 读ä¸æ¯é 读ç¨åºä¸ä¼è·å¾æ´å¿«; è¿æ¯å ³äº.pycæ件æ.pyoæ件çé度çå¯ä¸äºæ å°±æ¯ä¸å®ä»¬å è½½é度ã
è¿æ¯ä¸å¿ è¦çï¼ä»¥äº§çç¨äºä¸»èæ¬pycæ件çæ件ã åªæé£äºå¯è½ä¼è¢«å è½½å¤æ¬¡å¾ä¹¦é¦åºç¼å¶ã
ç¼è¾ ï¼
è¿ä¼¼ä¹ä½ 没æç½æçææã é¦å ï¼è®¤è¯å°ç¼å¶çæ´ä½æè·¯.pycæ件ä¹ä½åºäºåæ ·çæ件å¨ç¬¬äºæ¬¡æ§è¡é度æ´å¿«ã ç¶èï¼èèæ¯å¦åçPythonç¼è¯èæ¬æ£å¨è¿è¡ã 解éå¨å°åèç åå ¥å°ä¸ä¸ª.pycçæ件å¨ç¬¬ä¸æ¬¡è¿è¡ï¼è¿éè¦æ¶é´ã å æ¤ï¼å®çè³ä¼è¿è¡æç¹æ ¢ã ä½ å¯è½ä¼è®¤ä¸ºå®ä¼æ´å¿«ä¹åè¿è¡ã 好å§ï¼è¿åªæ¯ä¸ä¸ªéæ©ã æ¤å¤ï¼ä½ä¸ºthis说ï¼
æç¡®ä¼äºéå¼ã
å¦ææ³éè¿ä½¿ç¨å é.pycçæ件ï¼åºè¯¥æå¨ç¼è¯å¹¶è¿è¡.pycæç¡®æ件ã
è¦åçä½ çé®é¢ï¼åè6.1.3ã âç¼è¯âPythonæ件å¨Pythonæ£å¼æ件ã
å½èæ¬ç±å½ä»¤è¡ä¸ç»åºå®çååè¿è¡ï¼èæ¬çåèç ä¸ä¼è¢«åå ¥ä¸ä¸ª.pycæ件æ.pyoæ件ã å æ¤ï¼èæ¬çå¯å¨æ¶é´å¯éè¿ç§»å¨å®ç大é¨å代ç çä¸ä¸ªæ¨¡åï¼å¹¶å ·æå¯¼å ¥è¿ä¸ªæ¨¡åä¸å°å¯å¨èæ¬åå°ã å¦å¤ï¼ä¹å¯ä»¥å½å.pycæ件æç´æ¥.pyoæ件çå½ä»¤è¡ä¸ã
æè²å¦
让æåç±åæ¨ç±»ä¼¼è¿æ ·çé®é¢ä¸å¦æ¤ï¼å 为æææ ï¼æè§çå¤ææ··åç©ï¼ååè¿æè²ççæµäºæ ï¼äººä»¬å¼å§åå¾snippyï¼ä¸ç¥ä½æ æ¯ä¸ªäººé½å¤±å»äºèµéçå®é æ åµï¼æç»å¤±å»äºè½¨éåé¢çå ±ã
è¿ä¹å¤çææ¯é®é¢é½è³å°æä¸ä¸ªæç¡®ççæ¡ï¼ä½è¿äºâ为ä»ä¹âçé®é¢å¾å¾æ²¡æåªæ¯ä¸ä¸ªåä¸çï¼ç¡®å®ççæ¡ï¼ä¾å¦ï¼å¯ä»¥éè¿æ§è¡æå¼ç¨æå¨äººå£«ççæ¡æ¥éªè¯çæ¡ï¼ã å¨æçæ¥ï¼æ两个å¯è½çæ¹å¼æ¥æç¡®åç计ç®æºç§å¦â为ä»ä¹âçé®é¢ï¼
éè¿æåä¸ä¸ªå®ç°æå ³æ³¨ç项ç®çæºä»£ç ã è¿å°±è§£éäºâ为ä»ä¹âä»ææ¯è§åº¦æ¥çï¼ä»ä¹åææ¡ä»¶æ¯å¿ è¦çï¼ä»¥å¤èµ·è¿ç§è¡ä¸ºï¼
éè¿æå人类å¯è¯»çæç©ï¼æ³¨éï¼æ交信æ¯ï¼é®ä»¶å表çï¼ç±åä¸ä½åºè¯¥å³å®çå¼å人åç¼åçã è¿å°±æ¯â为ä»ä¹âï¼æå设OPæ¯æå ´è¶£ççæ£æä¹ï¼ä¸ºä»ä¹Pythonçå¼å人å使è¿ç§çä¼¼éæçå³å®ï¼
第äºç§åçæ¯æ´å é¾ä»¥è¯å®ï¼å 为å®éè¦è·å¾å¨è°åç代ç å¼åè çå¿ï¼ç¹å«æ¯å¦æ没æ容ææ¾å°ï¼å ¬å¼æ件ä¸çç¹å®è¡ä¸ºçå³å®ã
è¿ä»ä¸ºæ¢ï¼è¿ä¸ªè®¨è®ºæ7åçæ¯åªä¸æ³¨äºé 读çPythonçå¼åè çæå¾ï¼ä½åªæä¸ä¸ªå¨æ´æ¹å¼ç¨ ã ï¼å®å¼ç¨äºä¸åçOPçé®é¢äºPythonæåçé¨åãï¼
è¿æ¯æå¨ä¸æ²¿å¼ç¨æ¢åçäºâ为ä»ä¹âçé®é¢ä¸¤ä¾§çå°è¯ã
æºä»£ç
ä»ä¹æ¯è§¦å.pycæ件ç¼å¶çåææ¡ä»¶ï¼ 让æ们æ¥ççæºä»£ç ã ï¼ç¦äººï¼å¨GitHubä¸Python没æåå¸ä»»ä½æ è®°ï¼æ以æå°±åè¯ä½ ï¼æå¨å¯»æ¾715a6e ï¼ã
æå¨å¸æç代ç import.c:989å¨load_source_module()å½æ°ã æå¨è¿éååºä¸äºä½ä¸ºç®æ´èµ·è§ã
static PyObject *
load_source_module(char *name, char *pathname, FILE *fp)
{
// snip...
if (/* Can we read a .pyc file? */) {
/* Then use the .pyc file. */
}
else {
co = parse_source_module(pathname, fp);
if (co == NULL)
return NULL;
if (Py_VerboseFlag)
PySys_WriteStderr("import %s # from %s\n",
name, pathname);
if (cpathname) {
PyObject *ro = PySys_GetObject("dont_write_bytecode");
if (ro == NULL || !PyObject_IsTrue(ro))
write_compiled_module(co, cpathname, &st);
}
}
m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, pathname);
Py_DECREF(co);
return m;
}
pathnameæ¯è·¯å¾æ¨¡ååcpathnameæ¯ç¸åçè·¯å¾ï¼ä½æ¯ç¨pycæ件æ©å±åã å¯ä¸çç´æ¥é»è¾æ¯å¸å°sys.dont_write_bytecode ã é»è¾çå ¶ä½é¨åå°±æ¯é误å¤çã å æ¤ï¼æ们æ寻æ±ççæ¡ä¸å¨è¿éï¼ä½æ们è³å°å¯ä»¥çå°ï¼è°ç¨æ¤çä»»ä½ä»£ç å°å¯¼è´å¨å¤§å¤æ°é»è®¤é ç½®ç.pycæ件çæ件ã 该parse_source_module()å½æ°æ²¡æçæ£æä¹è¦æ§è¡çæµç¨ï¼ä½æä¼å¨è¿éæ¾ç¤ºï¼å 为æä¼åæ¥ç¨åã
static PyCodeObject *
parse_source_module(const char *pathname, FILE *fp)
{
PyCodeObject *co = NULL;
mod_ty mod;
PyCompilerFlags flags;
PyArena *arena = PyArena_New();
if (arena == NULL)
return NULL;
flags.cf_flags = 0;
mod = PyParser_ASTFromFile(fp, pathname, Py_file_input, 0, 0, &flags,
NULL, arena);
if (mod) {
co = PyAST_Compile(mod, pathname, NULL, arena);
}
PyArena_Free(arena);
return co;
}
è¿éçæ¾ççæ¹é¢æ¯ï¼å½æ°è§£æåç¼è¯çæ件ï¼å¹¶è¿åä¸ä¸ªæéçåè代ç ï¼å¦ææåï¼ã
ç°å¨ï¼æ们ä»å¤äºä¸ä¸ªæ»è¡åï¼è®©æ们å¤çè¿ä¸ªä»ä¸ä¸ªæ°çè§åº¦ã å¦ä½Pythonä¸å è½½å®çåæ°ï¼å¹¶æ§è¡å®ï¼ å¨pythonrun.cæç¨äºä»æ件å 载代ç 并æ§è¡å®çå 个åè½ã PyRun_AnyFileExFlags()å¯ä»¥å¤ç交äºå¼åé交äºå¼çæ件æ述符ã 对äºäº¤äºå¼çæ件æ述符ï¼å®å§æç»PyRun_InteractiveLoopFlags()è¿æ¯REPLï¼åé交äºå¼çæ件æ述符ï¼å®å§æç»PyRun_SimpleFileExFlags() PyRun_SimpleFileExFlags()æ£æ¥æ件å ä¸ç»æ.pyc ã å¦æè¿æ ·åçè¯ï¼å°±è°ç¨run_pyc_file()ç´æ¥å è½½ç¼è¯åèç ä»ä¸ä¸ªæ件æ述符ç¶åè¿è¡å®ã
å¨æ´å¸¸è§çæ åµä¸ï¼å³.pyæ件ä½ä¸ºåæ°ï¼ï¼ PyRun_SimpleFileExFlags()è°ç¨PyRun_FileExFlags()è¿æ¯æ们å¼å§æ¾å°äºçæ¡ã
PyObject *
PyRun_FileExFlags(FILE *fp, const char *filename, int start, PyObject *globals,
PyObject *locals, int closeit, PyCompilerFlags *flags)
{
PyObject *ret;
mod_ty mod;
PyArena *arena = PyArena_New();
if (arena == NULL)
return NULL;
mod = PyParser_ASTFromFile(fp, filename, start, 0, 0,
flags, NULL, arena);
if (closeit)
fclose(fp);
if (mod == NULL) {
PyArena_Free(arena);
return NULL;
}
ret = run_mod(mod, filename, globals, locals, flags, arena);
PyArena_Free(arena);
return ret;
}
static PyObject *
run_mod(mod_ty mod, const char *filename, PyObject *globals, PyObject *locals,
PyCompilerFlags *flags, PyArena *arena)
{
PyCodeObject *co;
PyObject *v;
co = PyAST_Compile(mod, filename, flags, arena);
if (co == NULL)
return NULL;
v = PyEval_EvalCode(co, globals, locals);
Py_DECREF(co);
return v;
}
è¿éççªåºçä¸ç¹æ¯ï¼è¿ä¸¤ä¸ªå½æ°åºæ¬ä¸æ§è¡ç¸åçç®çï¼è¿å£åçload_source_module()åparse_source_module() å®è°ç¨è§£æå¨å建ä»Pythonæºä»£ç çASTï¼ç¶åè°ç¨ç¼è¯å¨å建åèç ã
é£ä¹ï¼è¿äºä»£ç åå¤ä½çè¿æ¯ä»ä»¬çç®çä¸åï¼ ä¸åçæ¯ï¼ä¸ä¸ªåå è½½ä»æ件ç模åï¼èå ¶ä»å使ç¨çæ¯æ¨¡åä½ä¸ºåæ°ã 该模åç说æ³æ¯-å¨è¿ç§æ åµä¸-å¨__main__模åï¼å®ä½¿ç¨çæ¯ä½çº§å«çCå½æ°æ©äºæ¶åå¨åå§åè¿ç¨ä¸å建çã 该__main__模åä¸éè¿ææ£å¸¸ç模åå¯¼å ¥ä»£ç è·¯å¾ï¼å 为å®æ¯å¦æ¤ç¬ç¹ï¼å¹¶ä¸ä½ä¸ºä¸ä¸ªå¯ä½ç¨ï¼å®ä¸éè¿äº§ç代ç å».pycçæ件ã
æ»ç»ï¼ä¸ºä»ä¹åå __main__ ã模åæªç¼è¯.pycæ件æ¯å®æ¯ä¸æ¯âè¿å£âæ¯çï¼å®åºç°å¨sys.modulesä¸ï¼ä½å®éè¿ä¸æ¯çæ£ç模åå¯¼å ¥éåäºé常ä¸åç代ç è·¯å¾å°è¾¾é£éã
å¼åè æå¾
好äºï¼æ们ç°å¨å¯ä»¥çå°çè¡ä¸ºæ´å¤çæ¯ä¸Pythonç设计æ¯å¨æºä»£ç ä¸ä»»ä½æ确表达ççç±ï¼ä½æ¯è¿å¹¶æ²¡æåçè¿æ¯å¦æ¯ä¸ç§ææçå³å®ï¼æåªæ¯ä¸ä¸ªå¯ä½ç¨çé®é¢è¿ä¸ææ°ä»»ä½äººè¶³ä»¥æ为å¼å¾æ¹åã ä¸ä¸ªå¼æºç好å¤æ¯ï¼ä¸æ¦æ们åç°æ们æå ´è¶£çæºä»£ç ï¼æ们å¯ä»¥ä½¿ç¨VCS帮å©è¿½æº¯ï¼å¯¼è´ç®åå®æ½çå³å®ã
å ¶ä¸ä»£ç çå ³é®è¡è¿éï¼ m = PyImport_AddModule("__main__"); ï¼çåå²å¯ä»¥è¿½æº¯å°1990å¹´ï¼å¹¶å¨èªå·±BDFLï¼åå¤åçã å®å·²è¢«ä¿®æ¹ï¼å¨å¹²é¢çå²æï¼ä½ä¿®æ¹æ¯è¤æµ çã å½å®ç¬¬ä¸æ¬¡åï¼ä¸ä¸ªèæ¬åæ°ä¸»æ¨¡ååå§åæ¯è¿æ ·çï¼
int
run_script(fp, filename)
FILE *fp;
char *filename;
{
object *m, *d, *v;
m = add_module("`__main__`");
if (m == NULL)
return -1;
d = getmoduledict(m);
v = run_file(fp, filename, file_input, d, d);
flushline();
if (v == NULL) {
print_error();
return -1;
}
DECREF(v);
return 0;
}
è¿ä¹ååå¨.pycçæ件çè³è¢«å¼å ¥å°Pythonçï¼ é¾æªå½æ¶ç设计没æèèæ±ç¼æè´¦æ·èæ¬åæ°ã æ交信æ¯ç¥ç§å°è¯´ï¼
âç¼è¯âçæ¬
è¿æ¯å åçä¸ä¸ªæ¿è¯ºï¼å¨3天çæ¶é´......çæ¥ï¼åå¤æ¯æ·±å ¥å°ä¸äºé»å®¢/éæï¼è¿æ¯ä¸åå°æ¯ç¨³å®ç第ä¸ä¸ªçæ¬ã è¿ç§æ¿è¯ºçè³äºå¹´å·¦å³æ©äºPythonçå¼åé®ä»¶å表çå建ï¼
ä¿åç¼è¯çåèç å¼å ¥ä»¥å6个æï¼äº1991å¹´ã
è¿ä»ç¶æ©äºå表æå¡ï¼æ以æ们æä¸ä¸ªä»ä¹æ ·åå¤æ³æ²¡æçæ£çæ³æ³ã çæ¥ï¼ä»åªæ¯è®¤ä¸ºï¼è¿å£å为ææ¥å°ç¼ååèç çç®çï¼æ好çå°æ¹ã ä»æ¯å¦èèååæ ·ä¸ºç念__main__ä¸æ¸ ï¼è¦ä¹æ²¡ææ³å°ä»ï¼ä¸ç¶ä»è®¤ä¸ºè¿æ¯æ´å¤ç麻ç¦æ¯å®çä»·å¼ã
ææ æ³æ¾å°è¦ç¼å为主è¦æ¨¡åçåèç ç¸å ³çbugs.python.orgä»»ä½é误ï¼ä¹å¯ä»¥æ¾å°å ³äºå®çé®ä»¶å表ä¸çä»»ä½æ¶æ¯ï¼å æ¤ï¼æ¾ç¶æ²¡æ人认为è¿æ¯å¼å¾ç麻ç¦å°è¯æ·»å å®ã
æ»ç»ï¼ä¸ºä»ä¹ææ模åç¼è¯çç¼æ .pycé¤äº__main__æ¯ï¼å®æ¯åå²çæªçå¦ä½è®¾è®¡åå®ç°ã __main__被ä½åç¤æ代ç å.pycçæ件ï¼å³ä½¿åå¨ã å¦æä½ æ³ç¥éçå¤çæ¯ï¼ä½ éè¦çµåé®ä»¶åå¤åè¦æ±ã
æ ¼ä¼¦Â·æ¢ çº³å¾·çåç说ï¼
ä¼¼ä¹æ²¡æ人æ³è¿æ ·è¯´ï¼ä½ææ¢è¯å®ççæ¡å¾ç®åï¼æè¿ç§è¡ä¸ºæ²¡æåå®ççç±ã
æåæ100ï¼ ã æé´æ¥è¯æ®æ¥æ¯æè¿ä¸ç论ï¼æ²¡æ人å¨è¿ä¸ªçº¿ç¨å«äººæä¾çè¯æ®æ¥æ¯æä»»ä½å ¶ä»ç论çä¸ä¸ªåä¸ã æupvotedæ ¼ä¼¦çåçã
å 为å§æ¬æ£å¨è¿è¡å¯è½ä¼å¨æå¤æ¯ä¸æ°å½ççæpycæ件ï¼å¦/usr/bin ã