Python是否可以将.pyc
文件保存到位于sys.path
中的另一个文件夹中?
/code
foo.py
foo.pyc
bar.py
bar.pyc
收件人:
/code
foo.py
bar.py
/code_compiled
foo.pyc
bar.pyc
我希望这样做,因为我感觉这样会更有条理。谢谢你能给我的任何帮助。
更新:
在Python 3.8中,-X pycache_prefix=PATH
命令行选项可以将 .pyc
文件写入到与代码树相对应的给定目录下的并行树中。请参见$PYTHONPYCACHEPREFIX
环境变量。来源:@RobertT' answer
缓存位置在 sys.pycache_prefix
中报告(None
表示默认位置在 __pycache__
[自 Python 3.2 起] 子目录中)。
要关闭编译Python字节码的缓存,可以设置 -B
,然后Python不会尝试在导入源模块时写入 .pyc
文件。请参见$PYTHONDONTWRITEBYTECODE
环境变量。来源:@Maleev's answer
旧 [Python 2] 答案:
有PEP 304:控制生成字节码文件。它的状态是已撤销
,相应的补丁已被拒绝。因此可能没有直接的方法来实现它。
如果您不需要源代码,那么您可以直接删除*.py
文件。*.pyc
文件可以直接使用或打包成egg文件。
__pycache__
中。每个PYC文件包含解释器的名称和版本,例如__pycache__/foo.cpython-33.pyc
。您可能还有一个由早期版本的Python编译的__pycache__/foo.cpython-32.pyc
。正确的“魔法”会发生:如果与源代码不同步,则使用正确的文件并重新编译。在运行时,请查看模块的mymodule.__cached__
以获取PYC文件名,并使用imp.get_tag()
进行解析。更多信息请参见What's New section。__pycache__
目录仍然会使源代码凌乱。对于我来说,PYC文件的主要问题是在执行svn switch
等操作后留下未删除的目录。 - Suorimport imp; hasattr(imp, 'get_tag')
。 - ArtOfWarfare仅仅近十年之后,Python 3.8 终于提供了支持,可以通过设置环境变量 PYTHONPYCACHEPREFIX
或使用 -X pycache_prefix=PATH
参数将字节码存储在单独的并行文件系统树中(官方文档在这里)。
如果你愿意为此完全放弃字节码生成,那么有一个命令行标志:
python -B file_that_imports_others.py
可以放入IDE的构建/运行首选项中
我不同意。原因是错误的或者至少没有很好地表述;但是方向是正确的。有很多理由可以将源代码与编译对象分离。以下是其中一些(这些都是我在某个时候遇到的):
所有这些问题都有解决方法,但它们大多数是解决方法而不是解决方案。在大多数情况下,适当的解决方案是让软件接受替代位置来存储和查找这些过渡文件。
我同意,将代码分发为egg文件是保持其组织性的好方法。还有什么比包含所有所需代码和元数据的单个文件更有组织呢?改变字节码编译器的工作方式只会导致混淆。
如果你真的不喜欢那些pyc文件的位置,另一个选择是从只读文件夹运行。由于python无法写入,因此永远不会生成pyc文件。你要承受的代价是每个python文件在加载时都必须重新编译,无论你是否已经对其进行了更改。这意味着你的启动时间将会更长。
PYTHONPYCACHEPREFIX
设置(也可作为-X pycache_prefix
)配置隐式字节码缓存使用单独的文件系统树,而不是每个源目录中默认的__pycache__
子目录。
缓存的位置在sys.pycache_prefix
中报告(None
表示在__pycache__
子目录中的默认位置)。
"我觉得这样更有组织性" 为什么?怎么做?你想要实现什么目标?
保存编译器的输出的重点是在模块导入时节省一点加载时间。为什么要让它变得更加复杂呢?如果您不喜欢 .pyc 文件,那么可以定期运行“删除所有 .pyc 文件”的脚本。
它们并不是必需品;它们是有帮助的。为什么要关闭这个帮助呢?
这不是 C、C++ 或 Java,结果对象是必不可少的。这只是 Python 偶尔使用的缓存。我们在 Subversion 中将它们标记为“忽略”,以便它们不会意外地被检入。
ls
可以与通配符一起使用(即,ls *.py
)。尝试重新排列文件是浪费时间的行为,因为有两种简单的方法可以减少视觉混乱。 - S.Lott
os.system('del *.pyc')
(例如在 Windows 上)来删除它们。 - Charles