我最近开始使用SetupTools打包我的第一个项目,并且大部分都取得了成功.
不幸的是,我遇到了一个令人困惑的情况 - 我的项目依赖于PyPI上没有的单文件模块.我已经能够使用dependency_links选项轻松配置setup.py以依赖于该模块,并且一切正常......只要我使用setup.py来安装它.如果我尝试使用pip来安装项目egg,那么在尝试安装模块时会失败,假设它必须是预制的egg存档.相比之下,setup.py检测到它是一个简单的源文件并从中生成一个蛋.
我的目标是让我的项目在PyPI上可用,所以使用pip安装它是很重要的.所以我的问题是......我做错了什么?
我的理解是setuptools本质上是达到目的的手段,最终是pip和PyPI,所以对我来说这两个工具应该表现得如此不同似乎很奇怪.
setup.py的相关部分和每个工具的输出如下:
setup(
name='particle-fish',
version='0.1.0',
description='Python Boilerplate contains all the boilerplate you need to create a Python package.',
long_description=readme + '\n\n' + history,
author='Lachlan Pease',
author_email='predatory.kangaroo@gmail.com',
url='https://github.com/predakanga/particle-fish',
packages=[
'particle.plugins'
],
include_package_data=True,
install_requires=['particle', 'irccrypt', 'pycrypto'],
dependency_links=['http://www.bjrn.se/code/irccrypt/irccrypt.py#egg=irccrypt-1.0'],
license="BSD",
zip_safe=False,
keywords='particle-fish',
classifiers=[
'Development Status :: 2 - Pre-Alpha',
'Intended Audience :: Developers',
'License :: OSI Approved :: BSD License',
'Natural Language :: English',
"Programming Language :: Python :: 2",
'Programming Language :: Python :: 2.6',
'Programming Language :: …Run Code Online (Sandbox Code Playgroud) 我是一名经验丰富的编码员,但我仍然是STL的新手,并且刚遇到这个问题:
据我所知,STL容器并不意味着复制它们包含的对象,或者影响它们的生命周期,但实验上我看到了不同的结果.
特别是,如果它们在超出范围之前存储在容器中,则仍然可以访问字符串类,这些类用于在销毁时将其底层存储的第一个字符清零.例如,请考虑以下示例:
using namespace std;
queue<string> strQueue;
const char *genStr(int i)
{
ostringstream os;
os << "The number i is " << i;
strQueue.push(os.str());
return strQueue.back().data();
}
void useStr()
{
while(!strQueue.empty())
{
cout << strQueue.front() << endl;
strQueue.pop();
}
}
int main(int argc, char **argv)
{
for(int i = 0; i < 40; i++)
{
printf("Retval is: %s\n", genStr(i));
}
useStr();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当genStr()退出时字符串超出范围,我希望printf只输出"Retval is:",或者至少调用useStr()来给出未定义的结果,因为内存被踩到了通过额外调用的重复分配,但两者都返回适当存储的字符串,而不会失败.
我想知道为什么会这样,但取而代之的是,我很高兴知道我是否可以依赖任何旧物体发生的这种效应.
谢谢