如何获取当前最顶层的包,即setup.py 中定义的名称?
这是我的tree:
.
|-- README.md
|-- the_project_name_for_this_pkg
| |-- __init__.py
| |-- __main__.py
| |-- _config
| | `-- foo.conf
| |-- _data
| | `-- logging.yml
| `-- tests
| |-- __init__.py
| `-- test_foo.py <--- # executing from here
|-- requirements.txt
`-- setup.py
4 directories, 9 files
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已经开始工作的唯一解决方案是:
import os
import sys
os.path.basename(sys.path[1])
Run Code Online (Sandbox Code Playgroud)
但这显然是一个糟糕的解决方案。其他解决方案,例如__name__在我最上层的__init__.py文件中使用a并ast.parse用于阅读 的相关部分setup.py也似乎很麻烦。
我尝试过的其他解决方案 - 通过在我的python [子] 包中的unittest.TestCase继承class中调用它们tests- 包括检查 …
如何在PyPI项目的Project Links部分下添加链接?
我的 conda 导出是这样完成的:conda env export --file environment.yml -n djangoenv
文件本身如下所示:
\n\nname: djangoenv\nchannels:\n- bioconda\n- anaconda-cluster\n- defaults\ndependencies:\n- anaconda-cluster::python-apt=0.8.5=py27_0\n- auto::pyumpf=0.1.1=py27_0\n- binstar::binstar=1.3.1=py27_0\n- bioconda::httplib2=0.9.2=py27_0\n- clyent=1.2.2=py27_0\n- conda-forge::backports.shutil_get_terminal_size=1.0.0=py27_0\n- conda-forge::ca-certificates=2016.2.28=0\n- conda-forge::ipython=4.2.0=py27_0\n- conda-forge::pexpect=4.1.0=py27_0\n- conda-forge::pickleshare=0.7.2=py27_0\n- conda-forge::ptyprocess=0.5.1=py27_0\n- conda-forge::python-pathlib2=2.1.0=py27_0\n- conda-forge::traitlets=4.2.1=py27_0\n- dateutil=2.4.1=py27_0\n- decorator=4.0.9=py27_0\n- ecdsa=0.13=py27_0\n- ipython_genutils=0.1.0=py27_0\n- jinja2=2.8=py27_0\n- kbroughton::ansible=2.0.0.2=py27_0\n- markupsafe=0.23=py27_0\n- openssl=1.0.2h=0\n- paramiko=1.16.0=py27_0\n- pip=8.1.1=py27_1\n- psycopg2=2.6.1=py27_1\n- pycrypto=2.6.1=py27_0\n- python=2.7.11=0\n- pytz=2016.4=py27_0\n- pyyaml=3.11=py27_1\n- readline=6.2=2\n- requests=2.10.0=py27_0\n- setuptools=20.7.0=py27_0\n- simplegeneric=0.8.1=py27_0\n- six=1.10.0=py27_0\n- sqlite=3.9.2=0\n- tk=8.5.18=0\n- travis::ansible-shell=0.0.2=py27_0\n- wheel=0.29.0=py27_0\n- yaml=0.1.6=0\n- zlib=1.2.8=0\n- pip:\n - anaconda-client==1.3.1\n - ansible==2.0.0.2\n - ansible-lint==2.3.3\n - ansible-shell==0.0.2\n - backports.shutil-get-terminal-size==1.0.0\n - coverage==4.0.3\n - django==1.8\n - django-angular==0.7.15\n - django-countries==3.4.1\n - django-easy-pdf==0.1.0\n - django-money==0.7.4\n …Run Code Online (Sandbox Code Playgroud) 我有一个这样的文件夹结构:
- modules
- root
- abc
hello.py
__init__.py
- xyz
hi.py
__init__.py
blah.py
__init__.py
foo.py
bar.py
__init_.py
Run Code Online (Sandbox Code Playgroud)
这是字符串格式的相同内容:
"modules",
"modues/__init__.py",
"modules/foo.py",
"modules/bar.py",
"modules/root",
"modules/root/__init__.py",
"modules/root/blah,py",
"modules/root/abc",
"modules/root/abc/__init__.py",
"modules/root/abc/hello.py",
"modules/root/xyz",
"modules/root/xyz/__init__.py",
"modules/root/xyz/hi.py"
Run Code Online (Sandbox Code Playgroud)
我正在尝试以 python 导入样式格式打印出所有模块。一个示例输出是这样的:
modules.foo
modules.bar
modules.root.blah
modules.root.abc.hello
modules.root.xyz.hi
Run Code Online (Sandbox Code Playgroud)
我怎样才能在 python 中轻松地做到这一点(如果可能的话,没有第三方库)?
- modules
- root
- abc
hello.py
__init__.py
- xyz
hi.py
__init__.py
blah.py
__init__.py
foo.py
bar.py
__init_.py
Run Code Online (Sandbox Code Playgroud)
但是,此代码只会打印出 'foo' 和 'bar'。但不是“root”,它是子包。我也无法弄清楚如何转换它以保留它的绝对导入样式。当前代码只获取包/模块名称,而不是实际的绝对导入。
我知道可以在 setup.py 中使用extra-require. 现在我问自己是否有可能以一种您可以选择要安装的子包的方式将包标记为可选?有没有办法将可选依赖项映射到可选包。
例如,如果我有一个名为项目 A 的项目和这个包结构:
Project
--subPackage 1
--subPackage 2
--subPackage 3
Run Code Online (Sandbox Code Playgroud)
我想将子包 2 和 3 标记为可选,以便默认情况下不安装这些包。但是如果一个子包是通过 pip 或项目 B 的要求指定的,它应该与依赖项一起安装。
因此,项目 B 的预期行为应如下所示:
项目 B 的 setup.py:
setup(
name='Project B',
version='0.0.0',
install_requires=["ProjectA"])
Run Code Online (Sandbox Code Playgroud)
结果只安装了带有子包 1 的项目 1。但是,如果我将install_requires行更改为install_requires=["ProjectA[Subpackage2]"]. 项目 A 与子包 1 和 2 一起安装,并具有子包 1 和 2 的给定要求。
这是否可以为项目 A 创建一个 setup.py 来存档此行为?
今天去修改matplotlib的配置。搜索matplotlibrc显示我有两个:
查看site-packages文件夹,我发现很多包的名称中有波浪号:
~klearn是sklearn,但还有另一个sklearn。~atplotlib 也是 matplotlib,更改日期是 2018-11~-tplotlib的更改日期是 2019-3.15matplotlib的更改日期是2019-3.28(我最近确实更新了 matplotlib)这些波浪号名称包的用途是什么?我可以安全地删除它们吗?
不要感到困惑,有大量关于安装 Python 包、如何导入生成的模块以及列出可用包的问题。但是,如果您没有pip--what-provides样式文件或Pipenv Pipfile ,则似乎没有与 pip 等效的选项。此问题与上一个问题类似,但要求提供父包,而不是其他元数据。也就是说,这些其他问题没有得到很多关注或得到许多接受的答案 - 例如。如何查找给定模块的 python 包元数据信息。就这样砥砺前行……requirements.txt
举例来说,有两个包(仅举几例)将安装名为的模块serial- 即pyserial和serial。因此,假设安装了其中一个软件包,我们可以使用 pip list 找到它:
python3 -m pip list | grep serial
Run Code Online (Sandbox Code Playgroud)
但是,如果包的名称与模块的名称不匹配,或者您只是想找出要安装的包(在旧服务器或开发计算机上工作),就会出现问题。
您可以检查导入模块的路径 - 这可以给您提供线索。但继续这个例子......
>>> import serial
>>> print(serial.__file__)
/usr/lib/python3.6/site-packages/serial/__init__.py
Run Code Online (Sandbox Code Playgroud)
它位于一个serial目录中,但实际上只安装了pyserial ,而不是serial:
>>> import serial
>>> print(serial.__file__)
/usr/lib/python3.6/site-packages/serial/__init__.py
Run Code Online (Sandbox Code Playgroud)
我能想到的最接近的是生成一个可能在依赖子文件上失败的requirements.txtvia (就像我所做的那样),或者通过Pipenvpipreqs ./反向检查依赖关系(这会带来一整套新问题来完成所有设置):
> python3 -m pip list | grep serial
pyserial …Run Code Online (Sandbox Code Playgroud) 我有一个包含此setup.py文件的项目:
import setuptools
with open("README.md", "r") as fh:
long_description = fh.read()
setuptools.setup(
name="",
version="0.0.1",
author="",
author_email="",
description="",
long_description=long_description,
long_description_content_type="text/markdown",
packages=setuptools.find_packages(where="./src", exclude=("./tests",)),
classifiers=[
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
],
python_requires='>=3.8',
)
Run Code Online (Sandbox Code Playgroud)
这是我的项目目录结构(前两级):
$ tree -L 2
.
??? README.md
??? setup.py
??? src
? ??? my_pkg
??? tests
??? conftest.py
??? data
??? __init__.py
??? integration
??? __pycache__
??? unit
Run Code Online (Sandbox Code Playgroud)
当我运行任何 setuptools 命令时,我收到以下错误:
$ python setup.py …Run Code Online (Sandbox Code Playgroud) 是否可以将蛋糕减半并吃掉它:可以安装(通过某种机制)具有以下结构的项目:
pyproject.toml
setup.cfg
src/...
scripts/...
Run Code Online (Sandbox Code Playgroud)
在可编辑模式下,就像使用标准setup.py项目一样:
python3 -m pip install -e .
Run Code Online (Sandbox Code Playgroud)
(如果答案是:“ one does not install pyproj.toml packages in editable mode ”也可以)
在浏览 PyTorch 文档时,我遇到了这个词hermetic packages:
torch.package 添加了对创建包含任意 PyTorch 代码的密封包的支持。这些包可以保存、共享、用于在以后或在不同的机器上加载和执行模型,甚至可以使用 torch::deploy 部署到生产环境中。
我不明白在这种情况下密封包是什么意思。
通过对 Stack Overflow [1][2] 的一些搜索,这个术语似乎是软件世界中使用的通用术语。任何示例——甚至在 PyTorch/Python 世界之外——都有助于巩固我的理解。
谢谢!
python-packaging ×10
python ×8
setuptools ×4
pip ×3
python-3.x ×3
setup.py ×2
anaconda ×1
conda ×1
miniconda ×1
pep517 ×1
pypi ×1
pytorch ×1