我在PyCharm 3.4.1专业版中有两个纯python项目.第一个,我们称之为p(像包),结构为setuptools包(即使用setup.py,所有要求等,但它不会上传到pypi或任何其他在线存储库).第二个,我们称之为s(如脚本),只是一个python脚本和两个模块.
Project s(在PyCharm中)被配置为使用专用的virtualenv,让我们称之为venv.
我遇到的问题如下:当我像这样安装项目(包)p时venv:
$ source /path/to/venv/bin/activate
(venv)$ cd /path/to/p
(venv)$ python3 setup.py develop
Run Code Online (Sandbox Code Playgroud)
在项目中的PyCharm中s,import p语句是错误的,消息没有名为p的模块.但是,当我运行脚本时s,一切都很好,唯一的问题是PyCharm IDE抱怨无法找到模块.我可以忍受这个,但它很烦人......
为什么会这样?它是PyCharm的东西还是包装相关的东西?见下面的新闻.
项目/包p具有以下结构:
p/
|
+- p/
| |
| +- __init__.py
| +- other subpackages, modules, etc.
+- setup.py
+- README, DESCRIPTION, setup.cfg, etc.
Run Code Online (Sandbox Code Playgroud)
当我将PyCharm项目配置为p自己的virtualenv并在开发模式下安装时,一切正常.
新闻
PyCharm 5.0.4中仍然存在此问题.但是,我成功地解决了它.
出于某些原因,我不得不从pypi安装另一个包.我通过PyCharm进入文件 - >设置 - >项目: - >项目解释器,点击绿色+ …
目前,我们正在设置\在系统上安装一些软件包,方法是在install_requires属性下的setup.py中提及它们的版本和依赖项.我们的系统需要python 2.7.有时,用户有多个版本的python说2.6.x和2.7,它说的一些软件包已经可用但实际上在2.6网站软件包列表下可用的系统上.还有一些用户只有2.6,如何从setup.py强制执行,或者还有其他任何方式可以说只有python 2.7和我们想要setup.py更新的所有包只有2.7.我们在机器上要求至少2.7来运行我们的代码.
谢谢!Santhosh
我有一个C扩展项目需要numpy.理想情况下,我希望下载我的项目的人能够运行python setup.py install或使用一个电话pip.我setup.py遇到的问题是,我需要导入numpy来获取头文件的位置,但我希望numpy只是一个常规要求,install_requires以便从Python包索引中自动下载.
以下是我正在尝试做的一个示例:
from setuptools import setup, Extension
import numpy as np
ext_modules = [Extension('vme', ['vme.c'], extra_link_args=['-lvme'],
include_dirs=[np.get_include()])]
setup(name='vme',
version='0.1',
description='Module for communicating over VME with CAEN digitizers.',
ext_modules=ext_modules,
install_requires=['numpy','pyzmq', 'Sphinx'])
Run Code Online (Sandbox Code Playgroud)
显然,import numpy在安装之前我不能处于顶端.我已经看到一个setup_requires参数传递给setup()但是找不到任何关于它的用途的文档.
这可能吗?
Python打包教程建议“应首选静态元数据 (setup.cfg)。动态元数据 (setup.py) 仅应在绝对必要时用作逃生舱口。setup.py 曾经是必需的,但可以通过省略新版本的 setuptools 和 pip。”
打包和分发项目指南解释说“setup.cfg 是一个 ini 文件,其中包含 setup.py 命令的默认选项。有关示例,请参阅 PyPA 示例项目中的 setup.cfg。”
这个例子完全没用,而且似乎没有很多其他有用的信息。本教程中的示例表明,可以setuptools.setup()在 中列出一些或可能全部有效参数setup.cfg,但对此效果没有真正的解释。特别是,不清楚如何将列表参数(例如非常常见且重要的install_requires参数)转换为setup.cfg.
正如我通过推论和实验确定的,正确的方法如下:
[options]
install_requires =
dependency_1
dependency_2
Run Code Online (Sandbox Code Playgroud)
显然,最好将其正确记录在某处,以便新的包创建者不必仅仅为了指定其项目的依赖项而经历类似的过程。
存在这样的文档吗?
在讨伐令我的应用程序pip-installable,我打大打架setuptools和distribute.我假设我的依赖项是正确的,即安装pip install myapp可能应该正确填充虚拟环境.但是,我想在我开始的时候简化开发,所以我的目标是从一个空的virtualenvmake开始setup.py test(后来setup.py develop,但这是一个完全不同的斗争)用所有定义的依赖项填充它.
现在我的问题是:无论我怎么努力,我得到的都是依赖项安装.egg在我的项目目录中,这至少是次优的.我尝试创建一个setuptools可以使用的新命令pip(虽然看起来很笨拙但看起来很有用),但这不能成为解决方案(子类化和重写).
那么如何setup.py test填充virtualevn而不是我的工作目录呢?
我们有多个 python 项目,正在考虑将它们转换为使用pyproject.toml而不是setup.py.
有没有一种简单的方法可以自动执行此操作?
我正在尝试向Python distutils添加安装后任务,如如何使用简单的安装后脚本扩展distutils中所述?.该任务应该在已安装的lib目录中执行Python脚本.此脚本生成安装包所需的其他Python模块.
我的第一次尝试如下:
from distutils.core import setup
from distutils.command.install import install
class post_install(install):
def run(self):
install.run(self)
from subprocess import call
call(['python', 'scriptname.py'],
cwd=self.install_lib + 'packagename')
setup(
...
cmdclass={'install': post_install},
)
Run Code Online (Sandbox Code Playgroud)
这种方法有效,但据我所知,有两个不足之处:
PATH,则安装后脚本将使用不同的解释器执行,这可能会导致问题.distutils.cmd.Command.execute.我怎样才能改进我的解决方案?这样做有推荐的方法/最佳做法吗?如果可能的话,我想避免引入另一个依赖.
我在使用setup.py设置python包时遇到问题.首先,我有以下目录设置:
maindir
|- setup.py
|-mymodule
|- __init__.py
|- mainmodule.py
|-subdir
|- __init__.py
|- submodule.py
Run Code Online (Sandbox Code Playgroud)
即项目目录包含setup.py和一个目录mymodule,该目录本身包含两个目录中的两个python模块.该文件submodule.py只包含
teststring = "hello world"
Run Code Online (Sandbox Code Playgroud)
mainmodule.py 包含:
from .subdir import submodule
mainstring = "42"
Run Code Online (Sandbox Code Playgroud)
并setup.py包含:
import os
from setuptools import setup
setup(
name = "mytestmodule",
version = "0.0.1",
description = ("A simple module."),
packages=['mymodule'],
)
Run Code Online (Sandbox Code Playgroud)
当我from mymodule import mainmodule与ipython从内部sourceTest行为按预期工作,我可以引用例如,mainmodule.submodule.teststring这使我的字符串hello world.
另一方面,当我使用这个'package' python setup.py install并尝试做同样的事情(从其他目录中)时,我收到一个导入错误:
In …Run Code Online (Sandbox Code Playgroud) 我试图理解setup.py 之间extras_require()和之间的区别,install_requires()但无法得到它.两者都用于安装Python依赖项,但它们之间的区别是什么?
命名空间包的主题似乎对于初学者来说有点混乱,并且它的先前版本的Python以几种不同的方式实现它或者StackOverflow上的许多问答都是过时的并没有帮助.我正在寻找Python 3.5或以后的解决方案.
我正在将一堆Python代码重构为模块和子模块,并且努力使这些项目中的每一个都设置为在坐在同一名称空间中时彼此独立地运行.
我们最终将使用内部PyPi服务器,将这些软件包提供给我们的内部网络,并且不希望将它们与外部(公共)PyPi软件包混淆.
示例: 我有2个模块,我希望能够执行以下操作:
from org.client.client1 import mod1
from org.common import config
Run Code Online (Sandbox Code Playgroud)
反映的模块将分开:
存储库1:
org_client_client1_mod1/
setup.py
mod1/
__init__.py
somefile.py
Run Code Online (Sandbox Code Playgroud)
存储库2:
org_common_config/
setup.py
config/
__init__.py
someotherfile.py
Run Code Online (Sandbox Code Playgroud)
我的Git仓库已经设置为org_client_client1_mod1和org_common_config,所以我只需要在包装和执行安装__init__.py文件,我相信.
随着
__init__.py,我应该使用哪些(如果有的话)?:Run Code Online (Sandbox Code Playgroud)from pkgutil import extend_path __path__ = extend_path(__path__, __name__)要么:
Run Code Online (Sandbox Code Playgroud)import pkg_resources pkg_resources.declare_namespace(__name__)
有
setup.py,我还需要添加namespace_modules参数,如果是,我会使用namespace_modules=['org.common'],还是namespace_modules=['org', 'common']?
我可以通过以某种方式实现这一点而放弃以上所有内容吗?也许是更简单或更"pythonic"的东西?
setuptools ×10
python ×9
setup.py ×3
python-2.7 ×2
python-3.x ×2
distribute ×1
distutils ×1
import ×1
install ×1
numpy ×1
packaging ×1
post-install ×1
pycharm ×1
pypi ×1
virtualenv ×1