使用本地目录pypackages中的包运行python__

pythonloc的Python项目详细描述


pythonloc:从本地目录导入包的python替换

pythonlocpythonpip的替代品,它自动识别一个\pypackages\uu目录,并倾向于导入在此位置安装的包,而不是用户或全局站点包。如果您熟悉node,pypackages>的工作原理与node>模块类似。

因此,不是运行python,而是运行pythonloc,并首先自动搜索pypackages路径。而不是运行pip

这是使用虚拟环境的替代方法。

这是一个python实现,它是pep 582的"python本地包目录"。pythonloc的目标是在讨论将此功能添加到cpython本身时,创建一个可访问的工具。如果愿意,您可以使用这些更改来构建自己的cpython,而不是使用pythonloc。

请注意,PEP 582未被接受。从长远来看,它可能被接受,也可能不被接受。pythonloc是实验性的,它的api将来可能会改变。

推荐信

在python bytes播客的第117集的

"chad一直在packaging/pip空间中工作并编写一些令人兴奋的python工具和文章。"

-< HeRF="HTTPS://twITT.COM/WebLogy/Stofs/109255645612505856"Re="NofLoLo>"Jeff Triplett ,Python软件基金会主任

"我对pypackages如何帮助简化和简化python依赖项工作流非常感兴趣。很好地实现了早期的原型,供人们测试!"

-Florimond Manca,Bocadillo项目的创建者

系统要求

  • 巨蟒2.7+

安装:盒子里有什么?

使用

安装后
pip install --user pythonloc

python3 -m pip install --user pythonloc

您将有四个可用的cli工具:pythonlocpiplocpipx,以及pipfreeloc

蟒蛇科

"python local"的缩写,它是python的一个替代品,有一个重要的区别:local目录添加到sys.path的前面。<;version>;是python版本,类似于3.7。所有参数都被转发到python

所以不要运行

python ...

您将运行

pythonloc ...

如果采用pep 582,python本身就会有这种行为。

piploc

"pip local"的缩写,它使用与pythonloc相同的sys.path调用pip。如果安装程序包,则将目标安装目录修改为而不是全局站点程序包

如果pypackagese>目录不存在,将创建它。

所有参数都被转发到pip

所以不要运行

pip ...

您将运行

piploc ...

如果采用pep 582,我认为pip应该默认在适当的\upypackages\uuu目录下工作。如果需要,可以添加标志以安装到站点软件包。

pipx

注意:pipx仅随pythonloc for python 3.6+提供。

将所谓的"入口点"安装到\pypackages\uu会出现问题。入口点或"二进制文件"在$path上不再可用,因为它们将在虚拟环境或系统中安装。这些二进制文件非常流行和有用。二进制文件的例子有blackpytesttoxflake8mypypoetry,以及pipenv(实际上还有pythonloc本身)。

pipx是python的二进制安装程序和运行程序,在运行时,它会在相应的\upypackages\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu位置搜索二进制文件并运行它。如果您熟悉javascript的npx,它与此类似。

所以不要运行

BINARY [BINARY ARGS]

您将运行

pipx run BINARY [BINARY ARGS]

如果找不到,pipx将从临时目录安装并运行它。如果您要求在\u pypackages\uu目录中找到二进制文件,则可以运行

pipx run --pypackages BINARY [BINARY ARGS]

如果找不到二进制文件,将显示错误。

注意:在将新包安装到现有的\pypackages\uu目录时,将不会在../3.6/lib/bin中创建入口点,例如,如果已经存在某个入口点。为此,您需要运行piploc install-u包。执行此操作时,将替换目录的全部内容。要解决这个问题,需要修改pip本身。

如果采用pep 582,pipx将是运行二进制文件的一个很好的辅助工具。

管道冻结位置

运行pip freeze会出现一个问题,因为它显示了所有已安装的python包:那些位于site packages.pypackages>中的包。您可能只想输出安装到pypackages的包,而这正是pipfreeloc的作用。

它相当于pip freeze,但只输出中的包。这是必需的,因为没有内置的方法来使用标准pip。例如,命令pip freeze--target pypackages不存在。

不使用pipfreeloc处理任何参数

所以不要运行

pip install --user pythonloc
0

您将运行

pip install --user pythonloc
1

如果采用PEP 582,则应创建一个更健壮的解决方案来冻结pypackages的状态。

从Requirements.txt/lockFiles安装

这就像在pip中一样。您只需要一个requirements.txt文件来安装。

requirements.txt安装
pip install --user pythonloc
2

poetry.lock安装

PIP无法读取poetry.lock文件,因此必须生成requirements.txt文件。

pip install --user pythonloc
3

可能有一个export命令指向poetry但它还没有到达。参见https://github.com/sdispater/poetry/pull/675

从pipfile.lock安装

pip还不能读取pipfile,只有pipenv可以读取。因此,您需要使用pipenv生成requirements.txt。

pip install --user pythonloc
4

从长远来看,工具可以直接安装到pypackages中,或者piploc可以读取各种锁文件格式。

< H2>实例

脚本

pip install --user pythonloc
5
pip install --user pythonloc
6

CLI

您可以使用pythonloc运行任何python命令,它只需在引擎盖下运行python即可:

pip install --user pythonloc
7

另一个显示导入工作方式的示例:

pip install --user pythonloc
8

入口点/二进制文件

pip install --user pythonloc
9

缺点?

虽然这项激励计划相当令人兴奋,但有些事情是无法解决的。

  • 依赖于操作系统的包:python版本中的目录结构是有名称空间的,所以python 3.6的包不会与3.7混合使用,这很好。但有时不同操作系统的软件包安装方式不同,因此Windows可能与Mac等不匹配。
  • 站点包:此PEP首先查找,但将返回到站点包中查找。这并不是完全密封的,可能会导致对使用哪些包的一些混淆。我希望默认的搜索路径是而不是其他路径。
  • 感觉到的缺点——臃肿:许多人在各种论坛上提出了这一点,将其与node_modules进行了比较,但我不认为它适用于这里。一方面,如果没有更多的内容安装到虚拟环境中,也是一样的,所以这只是将其移动到本地目录中。没有额外的膨胀。事实上,它更明显,可以删除,因为它没有隐藏在虚拟env目录中。但更重要的是,我认为它膨胀或将被滥用的假设源于javascript的生态系统。javascript有一个众所周知的有限的标准库,开发人员需要更频繁地接触第三方包。此外,javascript社区严重依赖许多插件和transpilation。python没有。我觉得这个臃肿的论点没有说服力。
  • 一些pip安装特性。例如,当传递-u标志时,带有--targetpip install将清除lib/bin目录中的内容,但当未传递时,不会将任何内容放在那里。

FAQ

这与虚拟环境有何不同?

  • 虚拟环境可能包含也可能不包含系统包,而pythonloc将首先在中查找包,然后在中查找包,然后在其他位置(如用户或站点包)中查找包。
  • pythonloc不需要激活或停用
  • pythonloc只查找名为\upypackages\uu的本地目录。另一方面,虚拟环境激活会修改您的路径,这样无论您在哪个目录中,都可以访问虚拟环境包。

它是如何工作的?

它非常简单,只需输入不到100行代码。它使用python和pip中已经内置的功能。

它所做的只是在调用python和pip时提供了一点间接性。它在运行python时修改了pythonpath环境变量,使其包含

如果您查阅python--help的输出,您将看到以下内容:

< Buff行情>

pythonpath是一个":"分隔的目录列表,前缀为默认模块搜索路径。结果是sys.path。

pythonloc是pythonpath=.:\uuupypackages\<;version>;/lib的别名:$pythonpath pythonnargs

要将软件包安装到目录,它使用pip并运行

python3 -m pip install --user pythonloc
0

其中pipargs是传递给它的任何参数,例如piploc install requests

如果您正在安装软件包,它将插入参数

在pypackages中实际输入了什么?

安装的软件包就在那里。这包括它们的源代码,例如下面的requests目录。存储有关包的元数据d在*.dist info目录中。

如果您想修改或调试已安装软件包的源代码,那么这样做非常容易。只需在\u pypackages\uu中打开相应的文件并编辑!

python3 -m pip install --user pythonloc
1

如何从\u pypackages>中卸载程序包?

piploc将自动将pypackages添加到$pythonpath,因此

python3 -m pip install --user pythonloc
2

会起作用的。

如果您发现错误

< Buff行情>

不在…卸载包,外部环境…

然后运行deactivate以确保您没有使用虚拟环境,然后重试。

我能让python来代替调用pythonloc吗?

获取此行为的一个简单方法是在本地目录中创建符号链接

python3 -m pip install --user pythonloc
3

然后用

python3 -m pip install --user pythonloc
4

否则,您必须使用github上的参考实现来构建cpython。

为什么不使用pep 582的参考实现呢?

与安装pip包相比,构建和分发自定义cpython构建需要更多的开销。

如果你有兴趣的话,我们鼓励你去看看,这很酷!

如果它被接受并添加到cpython中,那么就不再需要pythonloc了。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
缺少java MIMessage附件   java试图从JSON数组向数据库插入数据   铸造java。util。ArrayList无法转换为java。util。矢量   在到达末尾后从头开始读取csv文件(Java、OpenCSV)   Java swing如何在另一个线程中打开框架   java如何为集合正确编写此比较器。排序(arrayList、comparator)?   JavaOOD将配置传递给外部类的最佳方式   java不确定如何使用switch语句从main()调用要运行的方法   java循环菜单以在选择后显示   java将位置对象转换为地址(谷歌地图)   java Hazel cast客户端端口问题   使用JarJar重新打包工具的java   使用Java Netscape目录LDAP API和二进制筛选器值   java如何从Google App Engine下载应用程序源文件   java如何居中javafx场景图“摄影机”   java调用servlet而不提交并停留在同一个JSP页面中   将文本文件加载到HashMap<Integer,List<String>>java中   JavaFX平台。重新加载站点后运行更高版本()